使用Zxing条形码扫描程序会导致SecurityException

koo*_*ng3 5 android securityexception barcode zxing android-intent

我在我的应用程序中使用Zxing Barcode Scanner启动,Intent以便我可以扫描条形码并将数据恢复到我的应用程序.很基本的东西; 它已经工作了很长时间没问题.我最近通过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)
Run Code Online (Sandbox Code Playgroud)

据我所知,堆栈跟踪存在一些问题com.ups.mobile.android,即使用Zxing应用程序的UPS应用程序.我尝试在同一部手机上安装UPS应用程序并触发onClick发生问题的事件.除了选择条件要求我选择条形码扫描应用程序或UPS应用程序以执行此操作之外,没有任何重大事件发生Intent.我唯一的猜测是,我们的两个应用程序都发生了某种冲突,一次只有一个人可以使用条形码扫描程序包,从而导致SecurityException.但这对我来说没有多大意义,因为我可以做到没问题,而且我想很多人都有多个使用Zxing安装的应用没有问题.

有没有人深入了解导致此错误的原因以及我可以采取哪些措施来解决此错误?

编辑:Per SeanOwen的评论,如果您特别遇到Barcode Scanner的麻烦,请务必使用IntentIntegrator.它们提供了一种内置方法setTargetApplications.您可以使用它来Intent使用实际的条形码扫描仪应用程序:setTargetApplications(IntentIntegrator.TARGET_BARCODE_SCANNER_ONLY);简单的馅饼.

Com*_*are 6

UPS Mobile没有链接到Barcode Scanner应用程序,但显然已经在其源代码中出现了问题.这并不是非常令人震惊,即使ZXing团队不支持也不推荐.

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

  1. 他们保持不变<intent-filter>,特别是在宣传他们正在处理com.google.zxing.client.android.SCAN行动的地方,尽管他们实际上并不是那个应用程序

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

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

UPS Mobile应该按照您的方式链接到条形码扫描仪,或者不宣传此操作.当然,这个bug应该得到修复.

遗憾的是,我能想到的唯一解决方法是为您添加IntentBarcode Scanner(com.google.zxing.client.android)的实际包名,以尝试将其限制为仅限该应用.

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

  • 这是我们强烈反对条形码扫描器复制和粘贴的重要原因之一.它通常是需要复制的不太称职的开发人员,并且他们没有像您概述的那样进行必要的更改.感谢您将其曝光.如果您在zxing(http://code.google.com/p/zxing/wiki/ScanningViaIntent)中使用提供的`IntentIntegrator`代码,则默认情况下将使用您引用的机制选择条形码扫描器或条形码扫描器+.使用我们的集成代码而不是自己动手的另一个原因...... (3认同)