【问题标题】:Zxing Galaxy S3中兴银河S3
【发布时间】:2013-01-17 05:35:18
【问题描述】:

我正在构建的一个应用程序使用 zxing 库来扫描一维和二维条码。我目前正在 Galaxy S3 上测试我的应用程序,每次手动或通过 IntentIntegrator 库打开 zxing Barcode Scanner 应用程序时,Barcode Scanner 在成功解码图像后崩溃。我无法查看堆栈跟踪,因为错误发生在我的项目之外。

有没有人能够在他们的设备上重现此错误?还有人知道导致问题的原因或修复方法是什么吗?

如果这些信息还不够,我可以尝试下载源代码,自己构建它,然后从堆栈跟踪中找出问题。

【问题讨论】:

    标签: android qr-code zxing barcode-scanner


    【解决方案1】:

    好的,所以我下载了项目源,构建它,在我的设备上运行,然后发现了问题。该问题与 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 的剪贴板实现!

    更新:

    我尝试了几种不同的解决方法来解决这个问题,包括简单的 null 检查和使用不推荐使用的方法(zxing 当前使用不推荐使用的剪贴板方法),不幸的是这些方法都不起作用。似乎不是 ClipboardManager 本身为空,而是它内部的一些成员变量为空。再一次,我猜测这是 S3 特有的,因为这是我遇到此问题的唯一手机。

    不幸的是,这意味着我目前最好的选择是完全删除对剪贴板的引用。

    【讨论】:

    • 不,ClipboardManager 不为空,我从未见过。是的,这是一些内部错误。我认为它在 Android 中,而不是基于我在开发控制台中看到的堆栈跟踪的三星库。您引用的不推荐使用的方法在应用程序支持的 Android 版本中没有被弃用 - 实际上较新的方法不存在。我有一个使用较新 API 的不同版本的应用程序,我看到了同样的问题。不知道发生了什么,但您可以捕获 NullPointerException 并继续前进。嗯,也许我应该在源代码中这样做。
    • @Sean 谢谢,这是有道理的。我确实相信我必须在 ZXing 的源代码中捕获 NullPointerException。如果您确实选择将该 catch 语句添加到 ZXing 的公共发行版中,我将不胜感激,因为这样我就可以可靠地使用 IntentIntegrator,而不是在我的应用程序源中包含修改后的 ZXing 库。此外,我不能 100% 确定这是 NullPointerException 可能未被捕获的唯一地方;我将继续在我的设备上对其进行测试,看看是否遇到任何其他问题。感谢您对 ZXing 项目的帮助和工作!
    【解决方案2】:

    查看我在 Barcode Scanner+ 中的实现,我可以建议尝试更新的剪贴板 API 并尝试以下操作:

    ClipboardManager manager = ...;
    manager.setPrimaryClip(ClipData.newPlainText(null, "your text here"));
    

    仅当您可以在以后的 Android 版本中使用较新的 API 时才可用。

    根据我之前的评论,您可以随时查看NullPointerException,如果副本不重要,则继续。为了更好地衡量,我将在源中的另一个位置执行此操作。

    【讨论】:

    • 谢谢。据我所知,我的应用程序实际上不需要剪贴板,因此只需捕获 NullPointerException 就足够了。
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多