後輩君がササッと調べてくれました!
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 形式に変更し、targetWidth
や targetHeight
は定義しないようにしました。
この状態で実行したところ、アプリが落ちなくなり、無事にカメラで撮影した画像データが取得できました!
また、sourceType を CAMERA から PHOTOLIBRARY に変更しても問題ありませんでした。
以上、Cordova のプラグイン「cordova-plugin-camera」利用時に、OutOfMemoryError でアプリが落ちる時の対処法でした。
というか、そもそも写真は PNG ではなく、JPEG で保存すべきでしたね…。
同じような現象にお悩みの方は、是非参考にしていただければと思います。