部落格 RSS 訂閱

相機外掛程式 8.0.0 版本發佈!
作者:Norman Breau
2024 年 11 月 02 日

我們很高興地宣布,我們剛剛發佈了 cordova-plugin-camera 的重大更新!

升級方法

cordova plugin remove cordova-plugin-camera
cordova plugin add cordova-plugin-camera@8.0.0

版本重點

這是一次重大更新,因為它包含了一些破壞性的公開 API 機制,但這是為了更好!

破壞性變更包括

此外,allowEdit 功能現在已棄用。查看更多詳細資訊

getPicture

相機外掛程式先前在使用 getPicture API 時,回傳路徑非常不一致。有時是 file:// URI,有時是原始檔案路徑。應用程式必須檢查,並且通常自行為路徑加上前綴才能使用它們。因此,我們將回傳的資料簡化為 URI。

所有平台現在都一致地回傳 <scheme>:...

對於所有平台,當使用 DATA_URL 選項時,回傳的 base64 編碼影像過去只會回傳 base64 編碼的部分。從 v8.0.0 開始,回傳的字串現在包含 data: URI 標頭,其中包含 base64 資料所代表的 MIME 類型。

對於 iOS,file:// URI 過去一直一致地回傳,因此這裡沒有做任何變更。

對於 Android,API 的行為取決於內容的底層來源而定。大多數時候會回傳原始檔案路徑。現在它將始終回傳某種 URI,但與 iOS 不同,假設它會是 file:// URI 是不安全的。

如果您過去在測試時為檔案路徑加上前綴,現在則不再需要。使用 FILE_URI 選項回傳的所有 URI 都可以由 `cordova-plugin-file@8.1.2` 及更高版本解析。

如需如何使用結果的範例,請參閱 相機外掛程式文件

URI 持久性

對於所有使用 FILE_URI 選項的平台,回傳的 URI 僅為暫時存取

當從相機來源內容時,檔案會儲存在應用程式的暫存目錄中,當磁碟空間不足時,作業系統可能會隨時清除該目錄。

當從使用者相簿來源內容時,回傳的 URI 具有作業系統提供的臨時讀取權限,該權限通常在應用程式結束後到期。

這表示不應儲存 getPicture 回傳的 URI。應用程式應根據自身的需求和要求決定如何處理它。

範例 1: 應用程式正在接收使用者個人資料圖片的影像,並且需要持久存取該內容。

解決方案:應用程式應將內容複製到應用程式的資料目錄,並儲存和使用複製的 URI。

範例 2: 應用程式正在接收要編輯或操作的影像。它只需要一次性讀取即可載入記憶體,以便將資料放入影像編輯器。

解決方案:應用程式可以安全地使用臨時 URI 來讀取和顯示內容,並稍後儲存操作後的資料。

可選的 WRITE_EXTERNAL_STORAGE 權限

對於 Android 7 - 12,此外掛程式過去總是包含 WRITE_EXTERNAL_STORAGE 權限,並且由於實作原因,這是運作所必需的。

從 v8.0.0 開始,相機外掛程式不再自動包含權限宣告,因為在大多數情況下不再需要它。

如果您的應用程式啟用 saveToPhotoAlbum 選項,則需要在 config.xml 檔案中新增以下內容

<platform name="android">
    <config-file target="AndroidManifest.xml" parent="/*" xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
    </config-file>
</platform>

如果您的應用程式不使用 saveToPhotoAlbum,則您的應用程式不需要任何權限即可操作相機或從使用者相簿中選取。

嘗試在沒有宣告 WRITE_EXTERNAL_STORAGE 的情況下使用 saveToPhotoAlbum 將導致在 Android 7、Android 8 和 Android 9 裝置上回傳錯誤。

棄用:allowEdit

從相機擷取影像或從相簿選取影像時,allowEdit 功能現在已棄用。此功能的行為在各平台之間不一致,並且通常不可靠,因為它依賴於底層相機應用程式的支援,而該應用程式不是標準的。

該功能目前仍然存在,並且在記錄的注意事項下應該可以正常運作,但 Apache Cordova 將不再為使用該功能引起的問題提供支援。allowEdit 選項計劃在稍後完全移除,且沒有直接替代方案。

使用 allowEdit 功能的使用者應改用專用的影像處理程式庫。

已知問題

iOS

當應用程式設定為使用 scheme 時,iOS 上的 FileEntry.toURL 方法不會產生 DOM 可用的 URI。此問題的修復將在稍後推出。同時,可以使用以下方法作為解決方案

// TODO: Remove when https://github.com/apache/cordova-plugin-file/pull/642 is released
function toDomURL(fileEntry) {
    if (cordova.platform === "ios") {
        return window.WkWebView.convertFilePath(fileEntry.nativeUrl);
    }
    else {
        return fileEntry.toURL();
    }
}

如果您的應用程式仍然託管在 iOS 的 file:// 通訊協定上,則不需要此解決方案。

Android

當從使用者相簿選取影像時,Android 將開始回傳 content:// 而不是 file:// URI,以便使用底層的 MediaStore API。為了使這些路徑可解析為 DOM 可用的 URL,AndroidInsecureFileModeEnabled 偏好設定必須為 "false" (預設值)。

請按照如何提交錯誤指南報告您發現的任何問題!

變更包括

破壞性變更

  • GH-902 fix(android): 始終回傳 uris (#902)
  • GH-909 refactor(android): 將 WRITE_EXTERNAL_STORAGE 設定為可選 (#909)
  • GH-910 fix(android): 將資料 uris 以 URI 形式回傳 (#910)
  • GH-911 fix(ios): 同步相機 API 回傳以符合 Android 變更 (#911)
  • GH-912 fix(browser): 使資料 uri 以實際 URI 字串的形式回傳 (#912)
  • GH-915 fix(android): 移除 WRITE_EXTERNAL_PERMISSION (#915)

改進

  • GH-901 fix(android): 將供應商存取隔離到子目錄 (#901)
  • GH-904 fix(android): 使用 VERSION_CODES 而不是硬編碼的 API 字面值 (#904)
  • GH-906 refactor(android): 將影像路徑用法取代為影像 uris
  • GH-907 refactor(android): 移除查詢影像用法 (#907)

修正

  • GH-903 fix(android): 儲存實例狀態時影像 uri 的序列化不正確 (#903)
  • GH-905 fix(android): 影像處理期間快取路徑建構不正確 (#905)

棄用

  • GH-914 棄用:allowEdit (#914)

文件

  • GH-913 docs: 修訂 v8 公開 API 變更,其中包含 getPicture 的回傳字串格式 (#913)