2012-05-10 51 views
0

我的Android應用程序在Droid X 2.3.4上運行,使用Cordova 1.6.1時遇到間歇性故障。我創建了一個示例項目(http://bit.ly/IWxTv7),它清楚地顯示了設備上的錯誤,但只是間歇性的。這經常發生,如果你運行樣本並重復拍照,經過大約6次嘗試後,你會看到崩潰。另外請注意,這可以在iOS和其他Android設備上正常運行,所以它的間歇性特定設備/操作系統讓我感到困惑。PhoneGap/Cordova 1.6.1 FileReader ReadAsDataURL在Droid X上運行時崩潰2.3.4

預期功能描述: 該示例允許用戶從庫或照相機中選擇一張照片,並將其顯示在頁面上的圖像元素中。真正的應用程序工作方式不同,但這會隔離問題。

代碼在做什麼: 按鈕上的點擊處理程序正在使用FILE_URI目標類型調用navigator.camera.getPicture方法。挑選照片後,系統將使用生成的臨時URI讀取圖像數據並將其複製到持久位置。這在FileReader對象上使用readAsDataURL方法。當它工作時,它會使用FileWriter對象上的寫入方法獲取結果並將其保存到持久位置。完成後,它將持久位置的URI返回到按鈕單擊事件處理程序,該處理程序將圖像元素的src屬性設置爲持久性URI。 (這部分不起作用,可能是因爲我沒有正確使用它,但它與真實應用無關,所以我沒有打擾故障排除,也不需要爲什麼不起作用的答案。)

崩潰: 運行該應用程序,點擊頁腳中的「照片」按鈕。當照片頁面加載時,點擊「Get from camera」或「Get from library」按鈕。選擇一張照片並返回到應用程序。如果該過程成功完成,圖像元素將顯示一個損壞的圖像圖標。如果該過程沒有成功完成,UI將保持原樣,否則應用程序將崩潰。我的分析: 嘗試執行FileReader.readAsDataURL時,應用程序間歇性崩潰。我得出這個結論,因爲它是總是我在崩潰之前看到的最後一個日誌條目。但是,在過去,我已經看到由於下游出錯而未成功執行的東西的日誌條目,因此我不能100%確定這是原因,只是一個假設。這次事故是間歇性的,但我能夠在6次嘗試之內很快複製。有時它會成功,但是當它失敗時,它似乎總是在嘗試執行readAsDataURL時這樣做。

是否有其他人遇到錯誤或崩潰嘗試以這種方式讀取本地文件?什麼是和如何解決這個問題?備用解決方案或變通方案必須允許我訪問基礎64編碼圖像數據。

回答

0

如果你有「adb logcat」的輸出,我可能會爲你找出這個問題,但現在我不得不告訴你我懷疑的是什麼。 Droid X上的攝像頭是8MP,這意味着它會拍攝高質量的照片,而且文件大小可能相當大。現在,當您嘗試將文件讀取爲Base64編碼數據時,數據的大小會變得更大,因爲base64會產生33%的開銷。

所以我懷疑發生的事情是你的應用程序拋出OutOfMemoryException並崩潰。可悲的是,你無法捕捉到OOM異常,因此除了重新使用應用程序以使用更少的內存外,沒有什麼可以完成的。

你可能想看看減少圖片的寬度/高度或質量,以減少整體文件大小。或者,只需將您的圖片標記設置爲您獲得的FILE_URI,而不是執行任何base64編碼。

+0

我已經拿到了25%。我可以嘗試降低質量,看看是否可以避免碰撞,我懷疑這可能會導致車禍,但是25%的車禍很低。恐怕如果我走得更少,那麼最終的圖像就沒用了。 – Robert

+0

我對這個速度的底部感興趣,所以我更新了樣本以將質量從25降低到5,並要求我們的測試人員嘗試一下。請繼續關注,並感謝您的幫助... – Robert

+0

我的測試人員在將質量設置爲5後報告了故障,所以我不認爲就是這樣。我沒有logcat輸出的轉儲,也沒有一個環境來測試我自己,但是在原始問題中有一個到我的示例項目的鏈接,所以如果你有一個droid x,我會如果你能夠很容易地重現這一點,就有興趣學​​習。 我已經看到請求readAsDataURL掛起,並且永遠不會在兩個測試電話上返回成功或失敗:運行2.3.5的pantech爆發和運行2.1的Galaxy S。 – Robert