Cordovaのカメラプラグイン (cordova-plugin-camera) のメジャーアップデートがリリースされました。本バージョンでは、いくつかの重要な変更や機能改善が含まれています。

プラグインの更新方法

Cameraプラグインは、次の手順で更新ができます。

1.該当のプロジェクトをMonaca IDE上で開きます
2.ヘッダーメニューの「Cordovaプラグインの管理」を選択
3.カメラプラグインの設定ボタンをクリック

4.プラグインバージョンのプルダウンから8系を選択

5.OKボタンで設定を保存

Monacaデバッガーの対応

Android用ストア版Monacaデバッガーは、2月中旬を目途に更新を予定しております。

それまでの間、カスタムビルドデバッガーをご利用いただきますようお願いします。カスタムビルド版デバッガーには、お客様のプロジェクトで有効化されているプラグインが全てインストールされており、より実際の環境に近い状態でテストが可能です。

変更点の概要

1. getPicture の動作変更

getPicture APIの返すパスの形式が統一されました。すべてのプラットフォームで <scheme>://... のURI形式が返されます。

DATA_URL オプションを使用した場合、Base64エンコードデータには data: URIヘッダー(MIMEタイプを含む)が追加されます。

getPictureのオプションごとの動作変更:

オプション 変更前 変更後
DATA_URL Base64エンコードされたデータのみ返される MIMEタイプを含むdata:URIヘッダー付きのBase64データが返される
FILE_URI • iOS: file:// URIが返される
• Android: コンテンツのソースに応じて生のファイルパスが返されることがあった
• iOS: 変更なし(従来通りfile:// URIが返される)
• Android: 常にURIが返される(file://またはcontent://など)

2. URIの永続性に関する変更

FILE_URI オプションを使用した場合、返されるURIのアクセスは一時的になります。カメラで撮影した画像はアプリの一時ディレクトリに保存され、OSによって削除される可能性があります。ギャラリーから取得した画像のURIは、一時的な読み取り権限が与えられ、通常アプリ終了時に無効となります。

アプリでの対応方法

シナリオ 推奨対応策
プロフィール画像の保存など、永続的にアクセスが必要 アプリのデータディレクトリにコピーし、コピーしたURIを使用
画像の一時編集が必要 一時的なURIを使用し、編集後に保存

3. WRITE_EXTERNAL_STORAGE のオプション化

Android 7 - 12 以前は WRITE_EXTERNAL_STORAGE 権限が常に必要でしたが、カメラプラグインv8.0.0 以降はデフォルトで不要になりました。saveToPhotoAlbum オプションを使用する場合のみ WRITE_EXTERNAL_STORAGEconfig.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>

4. allowEdit 機能の廃止

allowEdit オプションは非推奨となりました。

このオプションはカメラアプリの編集機能に依存しているため、端末によって動作が異なり、予測できない動作をする可能性があります。そのため、今後の使用は推奨されません。現在は引き続き使用できますが、将来的に削除される予定です。

代替策としては、下記のものが推奨されます。

  • allowEdit に依存しているアプリは、cropperjs などの専用の画像編集ライブラリを利用してください。
  • canvas API を使用して独自の編集機能を実装する方法もあります。

プラグインの既知の不具合

Camera Plugin 8系で下記の不具合が報告されています。

iOS

FileEntry.toURL メソッドを使うと、scheme:// を使用するアプリではDOMで利用できるURIが生成されません

回避策として、 以下の関数を使うと、iOSでも適切なURIを取得できます。(file:// プロトコルを使用している場合、この回避策は不要です。)

function toDomURL(fileEntry) {
    if (cordova.platform === "ios") {
        return window.WkWebView.convertFilePath(fileEntry.nativeUrl);
    } else {
        return fileEntry.toURL();
    }
}

Android

  • ギャラリーから画像を選択するとき、file:// ではなく content:// のURIが返される仕様に変更されています。
  • 対応策: AndroidInsecureFileModeEnabled の設定を false(デフォルト)にすることで、パスがDOM使用可能なURLとなります。