使用智兴条码扫描器会导致安全异常



我通过启动Intent在我的应用程序中使用Zxing条形码扫描仪,以便我可以扫描条形码并将数据返回我的应用程序。 非常基本的东西; 它已经工作了很长时间没有问题。我最近通过播放收到了以下堆栈跟踪的错误报告:

    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之外,没有任何重大事件发生。我唯一的猜测是,我们的两个应用程序都发生了某种冲突,一次只有一个人可以使用条形码扫描仪包,从而导致SecurityException。但这对我来说没有多大意义,因为我可以毫无问题地做到这一点,而且我想很多人都有多个使用 Zxing 的应用程序安装而没有问题。

有没有人深入了解导致此错误的原因以及我可以做些什么来修复它?

编辑:根据SeanOwen的评论,如果您特别遇到条形码扫描仪的麻烦,请确实使用IntentIntegrator。它们提供了一个内置的方法setTargetApplications .您可以使用它使Intent仅使用实际的条形码扫描仪应用程序:setTargetApplications(IntentIntegrator.TARGET_BARCODE_SCANNER_ONLY);像馅饼一样简单。

UPS Mobile 没有链接到条形码扫描仪应用程序,但显然已经烘焙了其源代码。这并不令人震惊,即使它不受支持,也不被 ZXing 团队推荐。

但是,UPS Mobile 开发人员随后做了两件事:

  1. 他们保持相同的<intent-filter> ,特别是当他们宣传他们正在处理com.google.zxing.client.android.SCAN操作时,尽管他们实际上不是那个应用程序

  2. 他们将活动标记为未导出

由于这个错误,选择器仍然会显示他们的活动,尽管他们的活动没有导出,因此无法启动。

UPS Mobile 要么应该按照您的方式链接到条形码扫描仪,要么不宣传此操作。而且,当然,这个错误应该得到修复。

不幸的是,我能想到的唯一解决方法是让您在Intent中添加条形码扫描仪(com.google.zxing.client.android)的实际软件包名称,以尝试将其限制为仅该应用程序。

让人想起另一个 SO 问题,它导致了我的一篇博客文章,这显然不足以教育 UPS,所以我可能会再次写博客......

最新更新