我正在尝试使用Google的 Activity 识别服务。几天前,一切正常运作,例如,我可以使用该服务进行连接以获取 Activity 信息。但是今天我发现我再也收不到了。查看日志后,我发现此错误:
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”有关吗?我确实在 list 文件中有权限
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>
我在Google上寻找答案,但大多数问题是它们未在 list 文件中放置权限。在我看来,这只是一个不同的问题……有人可以帮我吗?谢谢!
更新:
始终可以通过重新启动电话来解决此问题。但是,当我卸载该应用程序并通过Eclipse重新安装该应用程序时,它始终会重新出现。一个一致但奇怪的模式(至少对我而言)。我想知道手机在卸载后是否记住该应用程序并停止使其访问Google Play服务(或者由于某种原因Google Play服务只是不允许我的应用程序访问它)。有任何想法吗?
最佳答案
我想出了解决方案。原因是由于两件事的结合:
其他应用程序的组件是否可以调用服务或与之交互-如果可以,则为“true”,否则为“false”。当值为“false”时,只有相同应用程序或具有相同用户ID的应用程序的组件才能启动服务或绑定(bind)到该服务。
默认值取决于服务是否包含 Intent 过滤器。没有任何过滤器意味着只能通过指定其确切的类名来调用它。这意味着该服务仅供内部应用程序使用(因为其他人将不知道类名)。因此,在这种情况下,默认值为“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的手机上。所以这就是为什么我对这个问题感到困惑。为什么以前没有发生呢?无论如何,如果您遇到相同的问题(即,相同的应用程序在重新安装后无法使用服务),请选中“已导出”标志。