0

我在使用 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。(那部分不起作用,可能是因为我没有正确使用它,但它与真正的应用程序无关,所以我没有费心进行故障排除,也不需要回答为什么它不起作用。)

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

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

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

4

1 回答 1

0

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

所以我怀疑正在发生的是您的应用程序正在抛出 OutOfMemoryException 并崩溃。遗憾的是,您无法捕获 OOM 异常,因此除了重新设计应用程序以使用更少的内存外,没有什么可做的。

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

于 2012-05-10T19:06:02.100 回答