Sta*_*ang 11 permissions android google-play-services
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
我重新启动了手机,然后又恢复了工作.但是,在我重新安装应用程序后,再次出现同样的问题.谁能指出"真正的"问题会是什么?它与"pid = -1"有关吗?我在Manifest文件中有权限
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>
Run Code Online (Sandbox Code Playgroud)
我在Google上寻找答案,但大多数问题是他们没有在清单文件中添加权限.这在我看来只是一个不同的问题......任何人都可以帮助我吗?谢谢!
更新:重新启动手机始终可以解决问题.但是,当我卸载应用程序并通过Eclipse重新安装它时,它总会重新出现.一致但奇怪的模式(至少对我而言).我想知道手机是否记得该应用并在我卸载后停止访问Google Play服务(或者出于某种原因Google Play服务不允许我的应用访问它).有任何想法吗?
Sta*_*ang 13
我找到了解决方案.原因是两件事的结合:
重新安装会生成同一应用程序的新的不同uid(注意,通过重新安装,我的意思是从手机卸载应用程序,然后使用Eclipse重新安装).
默认情况下,在服务标签,"出口"的值是假的,所描述的在这里
其他应用程序的组件是否可以调用服务或与之交互 - 如果可以,则为"true",否则为"false".当值为"false"时,只有相同应用程序的组件或具有相同用户ID的应用程序才能启动服务或绑定到该服务.默认值取决于服务是否包含意图过滤器.没有任何过滤器意味着只能通过指定其确切的类名来调用它.这意味着该服务仅供应用程序内部使用(因为其他人不知道类名).所以在这种情况下,默认值为"false".另一方面,至少一个过滤器的存在意味着该服务旨在供外部使用,因此默认值为"true".
所以我只需将标志设置为"true"即可解决我的问题.(Google活动识别的示例代码使用值"false"而不是"true".)
<service
android:name="edu.umich.si.inteco.captureprobe.contextmanager.ActivityRecognitionService"
android:enabled="true"
android:exported="true"
>
</service>
Run Code Online (Sandbox Code Playgroud)
有趣的是,相同的代码适用于Android 4.3或更低版本.我在具有不同Android版本的四款不同手机上测试了我的代码,卸载/重新安装问题仅发生在Android 4.4的手机上.所以这就是为什么我一直对这个问题感到困惑.为什么不发生呢?无论如何,如果遇到同样的问题(即重新安装后同一个应用程序无法使用服务),请检查"已导出"标志.
| 归档时间: |
|
| 查看次数: |
4992 次 |
| 最近记录: |