使用Zxing条形码扫描器会导致SecurityException错误。

6

我在我的应用程序中通过启动Intent来使用Zxing条形码扫描器,以便扫描条形码并将数据传回我的应用程序。非常基础的东西,长期以来都没有问题。最近我通过Play收到了一个错误报告,其中包含以下堆栈跟踪:

    java.lang.SecurityException: Permission Denial: starting Intent 
{ act=com.google.zxing.client.android.SCAN cmp=com.ups.mobile.android/com.google.zxing.client.android.CaptureActivity } 
from ProcessRecord{421bafc8 11687:edu.byu.dburner.lendablefree/10141} 
(pid=11687, uid=10141) not exported from uid 10137
    at android.os.Parcel.readException(Parcel.java:1327)
    at android.os.Parcel.readException(Parcel.java:1281)
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1736)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1383)
    at android.app.Activity.startActivityForResult(Activity.java:3281)
    at edu.byu.dburner.lendable.xxxxx.xxxx$2.onClick(xxxxxx.java:539)
    at android.view.View.performClick(View.java:3644)
    at android.view.View$PerformClick.run(View.java:14313)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4514)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    at dalvik.system.NativeStart.main(Native Method)

据堆栈跟踪显示,com.ups.mobile.android出现了问题,这是一个同时使用Zxing应用程序的UPS应用程序。我在同一台手机上安装了UPS应用程序和我的应用程序,在问题发生的onClick事件上触发,除了要求我选择条形码扫描应用程序或UPS应用程序来执行Intent之外,没有发生什么重要的事情。我唯一的猜测是,我们两个应用程序都有某种冲突,只有一个人可以在一次使用Barcode Scanner包,导致SecurityException。但这对我来说没有任何意义,因为我可以轻松地做到这一点,而且我想许多人已经安装了多个使用Zxing的应用程序,没有任何问题。

是否有人了解是什么原因导致了这个错误,以及我该怎么做才能解决它?

编辑: 根据SeanOwen的评论,如果你在Barcode Scanner方面遇到这样的问题,请确实使用IntentIntegrator。他们提供了一个内置方法setTargetApplications,您可以使用它使Intent仅使用实际的Barcode Scanner应用程序:setTargetApplications(IntentIntegrator.TARGET_BARCODE_SCANNER_ONLY);像吃馅饼一样简单。


我猜测用户在您的应用程序启动意图时选择了已安装的UPS应用,而不是BarcodeScanner。然而,我不知道为什么会引发安全异常。尽管如此,我认为这可能会导致一些麻烦。 - FoamyGuy
1个回答

7
UPS Mobile似乎已经内置了条形码扫描器应用程序的源代码,但它并没有与该应用程序链接。尽管ZXing团队不支持和不推荐这种做法,但这并不令人惊讶。
然而,UPS Mobile开发人员接着又做了两件事情:
1. 他们保留了相同的< intent-filter >,特别是在宣传自己正在处理com.google.zxing.client.android.SCAN操作时,尽管他们实际上并不是那个应用程序。 2. 他们将活动标记为未导出。
由于这个bug,即使他们的活动未被导出且因此无法启动,选择器仍会显示他们的活动。
UPS Mobile要么应该像您一样链接到Barcode Scanner,要么不宣传这个操作。当然,这个bug应该得到修复。
不幸的是,我能想到的唯一解决方法就是在您的Intent中添加Barcode Scanner的实际包名称(com.google.zxing.client.android),以尝试将其限制为仅适用于该应用程序。
这让人想起另一个SO问题,它引发了我的一篇博客文章,显然这对UPS来说还不够教育,所以我可能会再次写关于这个问题的博客...

3
这是我们强烈反对复制并粘贴Barcode Scanner的主要原因之一。通常是不够称职的开发人员需要复制,但他们没有像您所概述的那样做出必要的更改。感谢您让这一点浮出水面。如果您使用zxing中提供的IntentIntegrator代码(http://code.google.com/p/zxing/wiki/ScanningViaIntent),它默认只会选择Barcode Scanner或Barcode Scanner+,使用您引用的机制。使用我们的集成代码而不是自己编写代码的另一个原因... - Sean Owen
@SeanOwen:啊,我最近没有查看过IntentIntegrator的内部--很高兴听到你正在将其与自己的项目联系起来。 - CommonsWare
@SeanOwen:我之前没有使用IntentIntegrator,而是自己处理。感谢您的进一步教育。 - koopaking3
我刚刚遇到了类似的问题,但错误日志中提到的不是UPS,而是:cn.menue.barcodescanner/com.google.zxing.client.android.CaptureActivity。IntentIntegrator 在其 initiateScan() 中确实引用了 Intent("com.google.zxing.client.android.SCAN")。 - Yar
@Yar:我无法使用 IntentIntegrator 重现你的问题。即使安装了该应用程序,IntentIntegrator 也会选择条形码扫描仪。我使用了此 IntentIntegrator 客户端进行测试:https://github.com/commonsguy/cw-omnibus/tree/master/Camera/ZXing - CommonsWare
感谢CommonsWare,我也是这样。菜单会出现,您可以选择条形码扫描器或其他应用程序。即使使用我的“旧”IntentIntegrator(C)2009 ZXing作者S. Owen,F. Lin,I. Potoczny-Jones,B. Drehmer,我也不知道我的用户如何出现错误。 - Yar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接