PhoneGap / Cordova 1.6.1 FileReader ReadAsDataURL在运行2.3.4的Droid X上崩溃

时间:2012-05-10 18:53:59

标签: android cordova filereader

我在使用Cordova 1.6.1在Droid X 2.3.4上运行的Android应用程序中遇到间歇性崩溃。我已经创建了一个示例项目(http://bit.ly/IWxTv7),它清楚地演示了设备上的错误,但只是间歇性地。它经常发生,如果您运行样本并重复选择照片,在大约6次尝试后您应该看到崩溃。另请注意,这在iOS和其他Android设备上运行正常,因此它的间歇设备/操作系统特定的这一事实令我感到困惑。

预期功能说明: 该示例允许用户从库或相机中选取照片,并将其显示在页面上的图像元素中。真正的应用程序工作方式不同,但这隔离了问题。

代码正在做什么: 按钮上的单击处理程序使用FILE_URI目标类型调用navigator.camera.getPicture方法。挑选照片后,系统使用生成的临时URI读取图像数据并将其复制到持久位置。这使用FileReader对象上的readAsDataURL方法。当它工作时,它会获取结果并使用FileWriter对象上的write方法将其保存到持久位置。完成后,它将持久位置的URI返回到按钮单击事件处理程序,该处理程序将图像元素的src属性设置为持久URI。 (那部分不起作用,可能是因为我没有正确使用它,但它与真正的应用程序无关,所以我没有打扰故障排除,不要需要回答为什么这不起作用。)

崩溃: 运行该应用程序,点击"照片"页脚中的按钮。加载照片页面时,点按“#34;从相机获取”#34;或"从图书馆获取"按钮。选择一张照片并返回应用。如果该过程成功完成,则图像元素将显示损坏的图像图标。如果该过程未成功完成,则UI将保持原样,否则应用程序将崩溃。

我的分析: 尝试执行FileReader.readAsDataURL时,应用程序会间歇性地崩溃。我得出了这个结论,因为它总是我崩溃之前看到的最后一个日志条目。但是,在过去,由于下游出现错误,我已经看到成功执行的内容中的日志条目未显示在控制台中,所以我不能100%确定是原因,只是一个假设。崩溃是间歇性的,但我能够在6次尝试中很快重现。有时它会成功,但是当它失败时,它似乎总是在尝试执行readAsDataURL时这样做。

是否有其他人遇到过尝试以这种方式读取本地文件的错误或崩溃?怎么了,我该如何解决这个问题?替代解决方案或变通方法必须才能访问基本64位编码图像数据。

1 个答案:

答案 0 :(得分:0)

如果你有“adb logcat”的输出,我可能会为你找出这个问题但是现在我必须告诉你我怀疑的。 Droid X上的摄像头是8 MP,这意味着它拍摄的图像质量非常高,文件大小可能非常大。现在,当您尝试将文件读取为Base64编码数据时,数据的大小会变得更大,因为base64会产生33%的开销。

所以我怀疑发生的事情是你的应用程序抛出OutOfMemoryException并崩溃。可悲的是,你无法捕获和OOM异常,所以除了重新使用应用程序以减少内存使用之外没有任何事情要做。

您可能需要考虑减小图片的宽度/高度或质量以减小整体文件大小。或者,只需将图像标记设置为您获得的FILE_URI,而不是进行任何base64编码。