权限拒绝:从pid = -1访问服务ComponentInfo {...}

时间:2014-05-16 01:34:11

标签: android permissions google-play-services

我正在尝试使用Google的活动识别服务。几天前,一切都像魅力,即我可以连接使用服务获取活动信息。但今天我发现我再也收不到了。看完日志后我发现了这个错误:

 05-15 21:19:27.196: W/ActivityManager(765): Permission Denial: Accessing service
 ComponentInfo{edu.umich.si.inteco.captureprobe/edu.umich.si.inteco.captureprobe.
 contextmanager.ActivityRecognitionService} from pid=-1, uid=10220 that is not exported   
 from uid 10223

我重新启动了手机,然后又恢复了工作。但是,在我重新安装应用程序后,再次出现同样的问题。谁能指出“真正的”问题会是什么?它与“pid = -1”有关吗?我在Manifest文件中有权限

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>

我在Google上寻找答案,但大多数问题是他们没有在清单文件中添加权限。这在我看来只是一个不同的问题......任何人都可以帮助我吗?谢谢!

更新: 可以通过重新启动手机来解决问题。但是,当我卸载应用程序并通过Eclipse重新安装它时,它总是会重新出现。一致但奇怪的模式(至少对我而言)。我想知道手机是否记得该应用并在我卸载后停止访问Google Play服务(或者出于某种原因Google Play服务不允许我的应用访问它)。有什么想法吗?

2 个答案:

答案 0 :(得分:12)

我找到了解决方案。原因在于两件事的结合:

  1. 重新安装会生成同一应用程序的新的不同uid (注意,重新安装我的意思是从手机中卸载应用程序,然后使用Eclipse重新安装)。

  2. 默认情况下,在服务标记中,“已导出”的值为false,如所述here

  3. 其他应用程序的组件是否可以调用服务或与之交互 - 如果可以,则为“true”,否则为“false”。当值为“false”时,只有相同应用程序的组件或具有相同用户ID的应用程序才能启动服务或绑定到该服务。 默认值取决于服务是否包含意图过滤器。没有任何过滤器意味着只能通过指定其确切的类名来调用它。这意味着该服务仅供应用程序内部使用(因为其他人不知道类名)。所以在这种情况下,默认值为“false”。另一方面,至少有一个过滤器的存在意味着该服务是供外部使用的,因此默认值为“true”。

    所以我只需将标志设置为“true”即可解决我的问题。 (Google活动识别的示例代码使用值“false”而不是“true”。)

         <service
            android:name="edu.umich.si.inteco.captureprobe.contextmanager.ActivityRecognitionService"
            android:enabled="true"
            android:exported="true"
            >
        </service>
    

    有趣的是,相同的代码适用于Android 4.3或更低版本。我在具有不同Android版本的四款不同手机上测试了我的代码,卸载/重新安装问题仅发生在Android 4.4的手机上。所以这就是为什么我一直对这个问题感到困惑。为什么不发生呢?无论如何,如果遇到同样的问题(即重新安装后同一个应用程序无法使用服务),请检查“已导出”标志。

答案 1 :(得分:3)

这不是特定于活动识别;它显然是4.4中的安全性改进,PendingIntents在系统中注册,更好的解决方案似乎是取消当前未决的意图(使用PendingIntent.FLAG_CANCEL_CURRENT)。

https://code.google.com/p/android/issues/detail?id=61850