浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【Cordova】カメラプラグイン利用時にOutOfMemoryErrorでアプリが落ちる時の対処法

後輩君がササッと調べてくれました!
Cordova に カメラプラグイン「cordova-plugin-camera」を導入した際、ギャラリーから選択した画像のサイズが大きすぎてアプリが落ちるというバグが発生していました。
今までは、カメラプラグインのオプションの allowEdit を有効にして、画像を正方形にトリミングしていたのですが、Android では、その方法が推奨されていないので、トリミングを行わないように変更しました。
そしたら、画像サイズが大きすぎでアプリがクラッシュ…。
なお、エラーメッセージは「OutOfMemoryError: Failed to allocate a 75497480 byte allocation with 16773216 free bytes and 59MB until OOM」というものでした。

 

で、それについてぼやいたら、後輩君が検索してヒットしたページを送ってくれました。
それがこちら。

Simon Mac Donald: Change to Camera code in PhoneGap 1.9.0
http://simonmacdonald.blogspot.com/2012/07/change-to-camera-code-in-phonegap-190.html

こちらの記事によると、「getPicture メソッドに quality や targetWidth / targetHeight などのいくつかのパラメータを指定すると、メモリ不足エラーが発生する可能性があります」とのこと。
それらを思いっきりやってる…!ということで、記事に掲載されていたサンプルコードを見本に、コードを下記のように修正しました。

const options = {
    quality: 100,
    correctOrientation: true,
    saveToPhotoAlbum: true,
    destinationType: navigator.camera.DestinationType.DATA_URL,
    sourceType: navigator.camera.PictureSourceType.CAMERA,
    encodingType: navigator.camera.EncodingType.JPEG,
};
navigator.camera.getPicture((imageData) => {
    // 成功時の処理
}, (error) => {
    // 失敗時の処理
}, options);

quality は 100 のまま、encodingType を JPEG 形式に変更し、targetWidthtargetHeight は定義しないようにしました。
この状態で実行したところ、アプリが落ちなくなり、無事にカメラで撮影した画像データが取得できました!
また、sourceType を CAMERA から PHOTOLIBRARY に変更しても問題ありませんでした。

 

以上、Cordova のプラグイン「cordova-plugin-camera」利用時に、OutOfMemoryError でアプリが落ちる時の対処法でした。
というか、そもそも写真は PNG ではなく、JPEG で保存すべきでしたね…。
同じような現象にお悩みの方は、是非参考にしていただければと思います。

  • この記事いいね! (0)