我正在阅读Mark Murphy的优秀的Commonsware书籍,但是需要消化的内容很多。我创建了一个名为“FakePlayer”的应用程序(假装是一个mp3播放器)。它包含一个服务。作为学习经验,我尝试编写一个微不足道的应用程序(只有一个按钮),其单击处理程序执行以下操作:
Intent i = new Intent();
i.setAction("com.example.cwfakeplayer.MyPlayerService");
Context context = getApplicationContext();
context.startService(i);
它运行良好 - 服务启动正常。我注意到Eclipse抱怨没有对服务的权限,所以我更新了服务的清单文件,添加了两行,即android:permissions和android:exported:
<service
android:name="MyPlayerService"
android:permission="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION"
android:exported="true"
<intent-filter>
<action android:name="com.example.fakeplayer.MyPlayerService"></action>
</intent-filter>
</service>
我使用Eclipse下的“debug”功能,将播放器应用重新加载到设备上(我正在使用Galaxy S2)。似乎它起作用了;启动器应用程序引发了一个权限异常,这是我预料到的。
然后,我在启动器应用程序的清单中添加了以下内容(以授予权限):
<manifest
...
<uses-sdk ....
....
<uses-permission android:name="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" />
我将starter app重新加载到设备上(使用Eclipse下的debug)。在starter app中仍然出现了权限错误。
我从设备中删除了两个应用程序并进行了重新安装(debug方式),先安装service app,然后再安装starter app。但仍然出现了权限错误。
我正在阅读Murphy高级Android书籍中的“如何使用远程服务”部分,所以我意识到这可能不是跨应用程序工作的最佳方式。
我执行了“adb shell dumpsys package”命令,找到了starter app,并发现它的“permissionsFixed=false”,并且没有“grantedPermissions”部分。我认为这意味着对starter app的清单更改未能使该权限添加到应用程序中。但我不知道为什么会这样。作为一次学习体验,到目前为止只产生了困惑...
非常感谢任何线索!谢谢!
<permission>
元素,因为我在一个插件示例中使用了它们:https://github.com/commonsguy/cw-omnibus/tree/master/RemoteViews 话虽如此,感谢你的好评! - CommonsWareandroid:permission
属性并未声明自定义权限,而是<permission>
声明。android:permission
表示组件应该由权限(自定义或其他)进行保护,但如果该权限不存在,则不会使用它。 - CommonsWare