6

我通过启动一个应用程序在我的应用程序中使用 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)

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

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

编辑:根据 SeanOwen 的评论,如果您在使用 Barcode Scanner 时遇到此问题,请务必使用IntentIntegrator. 他们提供了一个内置的方法setTargetApplications。您可以使用它来制作Intent唯一使用实际条码扫描仪应用程序:setTargetApplications(IntentIntegrator.TARGET_BARCODE_SCANNER_ONLY);轻松如馅饼。

4

1 回答 1

7

UPS Mobile 没有链接到 Barcode Scanner 应用程序,但显然已经嵌入了它的源代码。这并不令人震惊,即使它不受 ZXing 团队的支持和推荐。

然而,UPS Mobile 开发人员随后做了两件事:

  1. 他们保持不变<intent-filter>,特别是在他们宣传他们正在处理该com.google.zxing.client.android.SCAN操作的情况下,尽管事实上他们并不是那个应用程序

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

Courtesy of this bug, the chooser will still show their activity, despite the fact that theirs is not exported and therefore cannot be launched.

UPS Mobile either should be linking to Barcode Scanner the way you are, or not advertising this action. And, of course, this bug should get fixed.

Unfortunately, the only workaround I can think of would be for you to add in your Intent the actual package name for Barcode Scanner (com.google.zxing.client.android) to try to limit it to that app only.

This is reminiscent of another SO question, that led to a blog post of mine, that obviously was insufficient to educate UPS, so I'll probably blog on this again...

于 2012-07-09T11:31:58.133 回答