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でエンコードされた画像データにアクセスできるようにする必要があります。