我正在与Mark Murphy出色的Commonsware书籍合作 - 但要消化它还有很多东西。我建立了'FakePlayer'应用程序(假装是一个MP3播放器)。它包含一项服务。作为一种学习经历,我尝试编写一个简单的应用程序(只有一个按钮),其点击处理程序执行:
Intent i = new Intent();
i.setAction("com.example.cwfakeplayer.MyPlayerService");
Context context = getApplicationContext();
context.startService(i);
工作正常 - 服务开始正常。我注意到Eclipse抱怨该服务没有权限,所以我通过添加2行更新了服务的清单,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" />
我将启动器应用程序重新加载到设备上(使用Eclipse下的调试)。仍然在启动器应用程序中获得权限错误。
我从设备中移除了这两个应用并重新安装(使用调试...),首先是服务应用,然后是启动器。仍然得到烫发错误。
我正在努力完成Murphy先生的高级Android手册中的“如何使用远程服务”部分,因此我意识到这不是跨应用程序工作的最佳方式。
我做了一个'adb shell dumpsys package',找到了启动应用程序,发现它有'permissionsFixed = false'而没有'grantedPermissions'部分。我认为这意味着入门应用程序中的明显更改无法将perm添加到应用程序中。但我不明白为什么。作为一种学习经历,它到目前为止只产生了混乱......
任何线索都非常感谢!谢谢!
答案 0 :(得分:3)
我通过添加2行来更新服务的清单,android:permissions和android:exported
从技术上讲,android:exported="true"
是多余的,因为<intent-filter>
会自动导出<service>
。
我从设备中移除了这两个应用并重新安装(使用调试...),首先是服务应用,然后是启动器。仍然得到烫发错误。
您没有显示使用<permission>
元素声明自定义权限的位置。实际上,如果您同时控制这两个应用,请在两个清单中放置相同的<permission>
元素,因此两个应用的安装顺序不再重要。
答案 1 :(得分:-1)
尝试在清单
中替换它<service android:name="com.example.fakeplayer.MyPlayerService"></service>
而不是
<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>
如果这不起作用,请发布您的错误。