我正在构建的应用程序使用 zxing 库来扫描一维和二维条码。我目前正在 Galaxy S3 上测试我的应用程序,每次手动或通过 IntentIntegrator 库打开 zxing Barcode Scanner 应用程序时,Barcode Scanner 在成功解码图像后崩溃。我无法查看堆栈跟踪,因为错误发生在我的项目之外。
有没有人能够在他们的设备上重现此错误?还有人知道导致问题的原因或修复方法是什么吗?
如果这还不够信息,我可以尝试下载源代码,自己构建它,然后从堆栈跟踪中识别问题。
我正在构建的应用程序使用 zxing 库来扫描一维和二维条码。我目前正在 Galaxy S3 上测试我的应用程序,每次手动或通过 IntentIntegrator 库打开 zxing Barcode Scanner 应用程序时,Barcode Scanner 在成功解码图像后崩溃。我无法查看堆栈跟踪,因为错误发生在我的项目之外。
有没有人能够在他们的设备上重现此错误?还有人知道导致问题的原因或修复方法是什么吗?
如果这还不够信息,我可以尝试下载源代码,自己构建它,然后从堆栈跟踪中识别问题。
好的,所以我下载了项目源,构建它,在我的设备上运行,发现了问题。该问题与 CaptureActivity 将信息放入系统剪贴板这一事实有关。
根据我在 Galaxy S3 上开发的经验,我遇到了三星实现剪贴板服务的多个问题,即获取剪贴板服务的请求返回 null。
无论如何,在 ZXing 的 CaptureActivity 中,您可以找到以下代码行:
if (copyToClipboard && !resultHandler.areContentsSecure()) {
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
if (displayContents != null) {
clipboard.setText(displayContents);
}
}
不幸的是,由于剪贴板变量为空,应用程序将因空指针异常而崩溃。我注释掉了这部分代码,应用程序似乎运行没有问题。我相信在这里简单地添加一个空检查应该可以防止 S3 出现问题,同时允许该功能保留在其他设备上。我还假设应用程序的其他部分不依赖于输入剪贴板的数据;但是,由于我不熟悉应用程序的所有源代码,我无法确定这一点。
我将继续尝试将 ZXing 集成到我自己的项目中,看看这个修复是否有效。
现在,如果只有某人(我假设是三星)会修复 S3 的剪贴板实现!
更新:
针对这个问题,我尝试了几种不同的解决方法,包括简单的空值检查和使用不推荐使用的方法(zxing 当前使用不推荐使用的剪贴板方法),但不幸的是,这些方法都不起作用。似乎不是 ClipboardManager 本身为空,而是它内部的一些成员变量为空。再一次,我猜测这是 S3 特有的,因为这是我遇到此问题的唯一手机。
不幸的是,这意味着我目前最好的选择是完全删除对剪贴板的引用。
查看我在Barcode Scanner+中的实现,我可以建议尝试更新的剪贴板 API 并尝试以下操作:
ClipboardManager manager = ...;
manager.setPrimaryClip(ClipData.newPlainText(null, "your text here"));
这仅在您可以在以后的 Android 版本中使用更新的 API 时可用。
NullPointerException
根据我之前的评论,如果副本不重要,您总是可以抓住并继续。为了更好地衡量,我将在源代码中的另一个位置执行此操作。