不允许在没有权限的情况下启动Intent服务——发送方没有获得权限



我正在使用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下使用"调试"将播放器应用重新加载到设备上(我使用的是Galaxy S2)。这似乎奏效了;启动器应用程序导致权限异常,这是我所期望的。

然后我添加到starter应用程序的清单(给它权限):

<manifest
  ...
  <uses-sdk ....
  ....
  <uses-permission android:name="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" />

我将starter应用程序重新加载到设备上(在Eclipse下使用debug)。在启动器应用程序中仍然得到权限错误。

我从设备上删除了两个应用程序并重新安装(使用debug…),首先是服务应用程序,然后是启动器。还是烫发错误

我正在阅读Murphy先生的《Advanced Android》一书中的"如何使用远程服务"部分,所以我意识到这可能不是跨应用程序工作的最佳方式。

我做了一个'adb shell转储包',找到启动器应用程序,发现它有'permissionsFixed=false'和'grantedPermissions'部分。我认为这意味着启动应用程序中的显式更改没有设法将烫发添加到应用程序中。但我不知道为什么。作为一个学习经验,到目前为止它只产生了困惑....

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

我更新了服务的清单,增加了2行,android:permissions和android:exported

从技术上讲,android:exported="true"是多余的,因为有了<intent-filter>就会自动导出<service>

我从设备上删除了两个应用程序并重新安装(使用debug…),首先是服务应用程序,然后是启动器。还是烫发错误

您没有显示在哪里使用<permission>元素声明自定义权限。在实践中,如果你控制两个应用程序,把相同的<permission>元素在两个清单,所以你的两个应用程序的安装顺序不再重要。

尝试将此替换为您的清单

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

如果这不起作用,请贴出您的错误。

最新更新