未经许可不允许启动服务Intent - 发送者未获得权限

Art*_*wri 7 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);
Run Code Online (Sandbox Code Playgroud)

它工作正常 - 服务启动正常。我注意到 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>
Run Code Online (Sandbox Code Playgroud)

我在 Eclipse 下使用“调试”将播放器应用程序重新加载到设备上(我使用的是 Galaxy S2)。这似乎有效;入门应用程序导致了权限异常,这是我所期望的。

然后,我将其添加到入门应用程序的清单中(以授予其权限):

<manifest
  ...
  <uses-sdk ....
  ....
  <uses-permission android:name="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" />
Run Code Online (Sandbox Code Playgroud)

我将入门应用程序重新加载到设备上(在 Eclipse 下使用调试)。在启动应用程序中仍然出现权限错误。

我从设备中删除了这两个应用程序并重新安装(使用调试...),首先是服务应用程序,然后是启动程序。仍然出现烫发错误。

我正在阅读 Murphy 先生的高级 Android 书籍中的“如何使用远程服务”部分,因此我意识到这可能不是跨应用程序工作的最佳方式。

我做了一个“adb shell dumpsys package”,找到了启动应用程序,发现它有“permissionsFixed=false”并且没有“grantedPermissions”部分。我认为这意味着入门应用程序中的清单更改未能成功将烫发添加到应用程序中。但我不知道为什么。作为一种学习经历,到目前为止它只产生了混乱......

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

Com*_*are 4

我通过添加 2 行 android:permissions 和 android:exported 更新了服务的清单

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

我从设备中删除了这两个应用程序并重新安装(使用调试...),首先是服务应用程序,然后是启动程序。仍然出现烫发错误。

您不会显示您在何处声明元素的自定义权限<permission>。实际上,如果您控制两个应用程序,请将相同的<permission>元素放入两个清单中,这样两个应用程序的安装顺序就不再重要。