0

Cordova 1.6.1を使用して、DroidX2.3.4で実行されているAndroidアプリケーションで断続的なクラッシュが発生しています。デバイスのエラーを明確に示すサンプルプロジェクト(http://bit.ly/IWxTv7)を作成しましたが、断続的にしか発生しません。サンプルを実行して写真の選択を繰り返すと、約6回試行した後、クラッシュが発生することがよくあります。また、これはiOSおよびその他のAndroidデバイスで正しく機能するため、断続的でデバイス/OS固有であるという事実に戸惑うことにも注意してください。

期待される機能の説明:このサンプルを使用すると、ユーザーはライブラリまたはカメラから写真を選択して、ページの画像要素に表示できます。実際のアプリケーションの動作は異なりますが、これにより問題が特定されます。

コードの機能:ボタンのクリックハンドラーは、FILE_URI宛先タイプを使用してnavigator.camera.getPictureメソッドを呼び出しています。写真が選択されると、システムは結果の一時URIを使用して画像データを読み取り、永続的な場所にコピーします。これは、FileReaderオブジェクトのreadAsDataURLメソッドを使用します。動作すると、結果を取得し、FileWriterオブジェクトのwriteメソッドを使用して永続的な場所に保存します。それが完了すると、永続的な場所のURIがボタンクリックイベントハンドラーに返されます。これにより、画像要素のsrc属性が永続的なURIに設定されます。(その部分は、おそらく正しく使用していないために機能しませんが、実際のアプリには関係がないため、トラブルシューティングを行う必要はなく、なぜそれが機能しないのかについての回答は必要ありません。)

クラッシュ:アプリを実行し、フッターの[写真]ボタンをタップします。写真ページが読み込まれたら、[カメラから取得]または[ライブラリから取得]ボタンをタップします。写真を選んでアプリに戻ります。プロセスが正常に完了すると、画像要素に壊れた画像アイコンが表示されます。プロセスが正常に完了しなかった場合、UIはそのままであるか、アプリケーションがクラッシュします。

私の分析:FileReader.readAsDataURLを実行しようとすると、アプリケーションが断続的にクラッシュします。クラッシュする前に表示される最後のログエントリであるため、この結論に達しましたただし、過去に、正常に実行されたものからのログエントリが、ダウンストリームのエラーのためにコンソールに表示されないのを確認したので、それが原因であるかどうかは100%わかりません。単なる仮説です。クラッシュは断続的に発生しますが、6回の試行でかなり迅速に再現できました。成功することもありますが、失敗すると、readAsDataURLを実行しようとすると常に成功するように見えます。

この方法でローカルファイルを読み取ろうとすると、他の誰かがエラーやクラッシュに遭遇しましたか?何が起きているので、どうすれば修正できますか?別の解決策または回避策では、base64でエンコードされた画像データにアクセスできるようにする必要があります。

4

1 に答える 1

0

「adblogcat」の出力があれば、おそらくこの問題を特定できますが、今のところ、私が疑うことを説明する必要があります。DroidXのカメラは8MPです。つまり、かなり高品質の写真を撮ることができ、ファイルサイズはかなり大きくなる可能性があります。これで、ファイルをBase64でエンコードされたデータとして読み取ろうとすると、base64が33%のオーバーヘッドを課すため、データのサイズがさらに大きくなります。

したがって、私が疑っているのは、アプリケーションがOutOfMemoryExceptionをスローしてクラッシュしていることです。残念ながら、例外をキャッチしてOOMすることはできないため、メモリの使用量を減らすためにアプリを作り直す以外に何もする必要はありません。

全体的なファイルサイズを減らすために、画像の幅/高さまたは品質を下げることを検討することをお勧めします。または、base64エンコーディングを行うのではなく、取得したFILE_URIに画像タグを設定するだけです。

于 2012-05-10T19:06:02.100 に答える