我正在尝试使用 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”有关吗?我确实拥有清单文件中的权限
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>
我在谷歌上寻找答案,但大多数问题是他们没有在清单文件中放置权限。在我看来这只是一个不同的问题......有人可以帮助我吗?谢谢!
更新:
该问题始终可以通过重新启动手机来解决。但是,当我卸载该应用程序并通过 Eclipse 重新安装时,它总是会重新出现。一种一致但奇怪的模式(至少对我来说)。我想知道手机是否会记住该应用程序并在我卸载它后阻止它访问 Google Play 服务(或者由于某种原因 Google Play 服务不允许我的应用程序访问它)。有任何想法吗?
我想出了解决办法。原因是由于两件事的结合:
重新安装生成同一应用程序的新的不同 uid(注意,重新安装是指从手机中卸载应用程序,然后使用 Eclipse 重新安装)。
默认情况下,在服务标签中,“exported”的值为 false,如所述here http://developer.android.com/guide/topics/manifest/service-element.html#prmsn
其他应用程序的组件是否可以调用该服务或与其交互 - 如果可以,则为“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的手机上。这就是为什么我一直对这个问题感到困惑。为什么以前没有发生过?无论如何,如果您遇到同样的问题(即同一应用程序在重新安装后无法使用服务),请检查“导出”标志。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)