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

11

我正尝试使用谷歌的活动识别服务。几天前一切都运作良好,即我可以连接该服务以获取活动信息。但今天我发现无法再接收到任何信息了。在查看日志后,我发现了这个错误:

 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"/>

我在Google上寻找答案,但大多数问题都是他们没有在清单文件中添加权限。这对我来说似乎只是一个不同的问题……有人能帮帮我吗?谢谢!

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


是的,我做了。以前它也能正常工作。 - Stanley Chang
2个回答

15

我找到了解决方法,原因是由于两个因素的组合:

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

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

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

因此,我通过将标志设置为“true”来简单地解决了我的问题。(Google Activity Recognition的示例代码使用“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的手机上发生了卸载/重新安装的问题。这就是为什么我一直被这个问题困扰。为什么以前没有发生呢?无论如何,如果你遇到了同样的问题(即同一个应用程序在重新安装后无法使用服务),请检查“exported”标志。


1
导出服务的唯一潜在问题是它可能会被恶意应用程序访问。最好创建一个ActivityRecognitionService,该服务验证并将任何识别结果转发到内部服务。 - Sofi Software LLC

3

那怎么回答楼主的问题呢? - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接