不允许未经许可启动服务 - 发件人无法获得权限

时间:2013-03-18 01:42:45

标签: android commonsware android-permissions

我正在与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添加到应用程序中。但我不明白为什么。作为一种学习经历,它到目前为止只产生了混乱......

任何线索都非常感谢!谢谢!

2 个答案:

答案 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>

如果这不起作用,请发布您的错误。