cordova-plugin-camera で写真を撮ったりカメラロールから写真をアップさせたりする

今更ながらこんな初歩的な Cordova プラグインを紹介。

cordova-plugin-camera は、カメラ撮影ができるプラグイン。単純にカメラを起動するだけでなく、撮影した画像をその場でリサイズ・圧縮したり、カメラロールから画像を選択させたりすることができる。画像を Data URL 形式で受け取ることもできるので、テキストデータとしてフォーム送信させたりすることもできる。

プラグインのインストール

では早速プラグインをインストール。

$ cordova add cordova-plugin-camera

写真を撮影するボタンを作ってみる

HTML 側は省略。ボタンを押すとカメラを起動し、撮影された写真をリサイズして Data URL 形式で取得するコードを書いてみる。

window.navigator.camera.getPicture((imageData) => {
  // JPG 画像を Data URL 形式で受け取るので、Data URL のヘッダを付けて img 要素の src 属性値に設定して画面表示させてみる
  document.getElementById('img').src = 'data:image/jpeg;base64,' + imageData;
}, (error) => {
  // カメラを起動後、キャンセルしてカメラ画面を閉じた場合などにもエラーコールバックに入るので、ココでは特にハンドリングしないでおく
  console.log(error);
}, {
  // 各種設定
  // 画像の取得元
  sourceType: window.navigator.camera.PictureSourceType.CAMERA,
  // 画質 : 0 〜 100 (高画質)
  quality: 80,
  // 撮影後の写真のサイズ指定
  targetWidth: 640,
  targetHeight: 480,
  // JPG でエンコードする
  encodingType: window.navigator.camera.EncodingType.JPEG,
  // 撮影した画像の編集をさせない
  allowEdit: false,
  // 撮影した画像をどんな形式で受け取るか : Data URL で受け取ることにする
  destinationType: window.navigator.camera.DestinationType.DATA_URL
});

オプションは全てではなく、設定値によって組み合わせがある。

window.Camera (パスカルケース) は定数の類のみ持っている。window.navigator.camera (キャメルケース) は getPicture() などの関数と定数を両方持っている (なんでこんな仕様なんだろう?)。定数であれば window.Camera.MediaType.JPEG としても window.navigator.camera.MediaType.JPEG としてもどちらでも良い。

Data URL 形式で画像を受け取るようにすると、写真を撮影してもカメラロールに保存されないので、ユーザのカメラロールを汚さずに写真撮影してもらうことができる。上述の例では #img な要素の src 属性に Data URL を設定して画面表示するようにしたが、FormData に append() したりしても良いだろう。

カメラロールから画像を取得する際は sourceTypeSAVEDPHOTOALBUM を選ぶと良いだろう。mediaTypeVIDEOALLMEDIA に指定すれば、動画ファイルを選ばせることもできる。ただし動画ファイルの場合は destinationTypeNATIVE_URI となり、ファイル URL を返されることになるので注意。

また、カメラ撮影しつつ、FILE_URI で受け取るようにした場合は、アプリ内の一時ディレクトリに画像が保存されるので、よきタイミングで cleanup() を実行して画像ファイルのキャッシュを削除してやる必要がある。

window.navigator.camera.cleanup(() => {
  console.log('Cleanup Success');
}, (error) => {
  console.log('Cleanup Failed : ' + error);
});

簡単な API だが色々なインプット・アウトプット方法があるので、色々な使い方ができるだろう。