Android 权限拒绝:从pid=-1访问服务组件信息{…}

Android 权限拒绝:从pid=-1访问服务组件信息{…},android,permissions,google-play-services,Android,Permissions,Google Play Services,我正在尝试使用谷歌的活动识别服务。几天前,一切都很顺利,即我可以连接并使用该服务获取活动信息。但今天我发现我再也收不到了。查看日志后,我发现以下错误: 05-15 21:19:27.196: W/ActivityManager(765): Permission Denial: Accessing service ComponentInfo{edu.umich.si.inteco.captureprobe/edu.umich.si.inteco.captureprobe. contextma

我正在尝试使用谷歌的活动识别服务。几天前,一切都很顺利,即我可以连接并使用该服务获取活动信息。但今天我发现我再也收不到了。查看日志后,我发现以下错误:

 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”有关?我在清单文件中有权限

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

我在谷歌上寻找答案,但大多数问题是他们没有在清单文件中放置权限。在我看来,这只是一个不同的问题……有人能帮我吗?谢谢

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

我想出了解决办法。原因是两方面的结合:

  • 重新安装会为同一应用程序生成新的不同uid(注意,我所说的重新安装是指从手机上卸载应用程序,然后使用Eclipse重新安装)

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

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

    因此,我只需将标志设置为“true”就解决了我的问题。(谷歌活动识别的示例代码使用值“false”而不是“true”。)

    
    

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

    这不是特定于活动识别;这显然是4.4中的一个安全改进,PendingEvents在系统中注册,更好的解决方案似乎是取消当前的挂起意图(使用PendingEvent.FLAG_cancel_current)


    是的。导出服务的唯一潜在问题是,恶意应用程序可以访问该服务。最好是创建一个ActivityRecognitionService来验证任何识别结果并将其转发给内部服务。这如何回答OP的问题?
         <service
            android:name="edu.umich.si.inteco.captureprobe.contextmanager.ActivityRecognitionService"
            android:enabled="true"
            android:exported="true"
            >
        </service>