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

我正在尝试使用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重新安装时,它总是重新出现。 一个一致的但奇怪的模式(至less对我来说)。 我想知道手机是否记得该应用,并在我卸载后停止访问Google Play服务(或者由于某些原因,Google Play服务不允许我的应用访问该应用)。 有任何想法吗?

Solutions Collecting From Web of "权限拒绝:从pid = -1访问服务ComponentInfo {…}"

我想出了解决办法。 原因是由于两件事的结合:

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

  2. 默认情况下,在服务标签中,“exported”的值为false,如此处所述

其他应用程序的组件是否可以调用服务或与其交互 – 如果可以,则为“true”,否则为“false”。 当值为“false”时,只有具有相同用户ID的相同应用程序或应用程序的组件才能启动服务或绑定到该服务。 默认值取决于服务是否包含意图filter。 没有任何filter意味着它只能通过指定其确切的类名来调用。 这意味着该服务仅用于应用程序内部使用(因为其他人不知道类名)。 所以在这种情况下,默认值是“false”。 另一方面,至less存在一个filter意味着该服务是为了外部使用,所以默认值是“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版本在四款不同的手机上testing了我的代码,而卸载/重新安装问题只发生在Android 4.4的手机上。 所以这就是为什么我一直困惑的问题。 为什么之前没有发生? 无论如何,如果遇到同样的问题(即重新安装后,同一个应用程序无法使用服务),请检查“已导出”标志。

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

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