【问题标题】:Not allowed to start service Intent without permission - sender does not get permissions未经许可不允许启动服务意图 - 发件人没有获得权限
【发布时间】:2013-03-18 01:42:44
【问题描述】:

我正在使用 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)。它似乎奏效了;入门应用程序导致了我预期的权限异常。

然后我添加到启动应用的清单中(授予它权限):

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

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

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

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

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

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

【问题讨论】:

    标签: android commonsware android-permissions


    【解决方案1】:

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

    从技术上讲,android:exported="true" 是多余的,因为 &lt;intent-filter&gt; 会自动导出 &lt;service&gt;

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

    您没有显示您曾在何处使用 &lt;permission&gt; 元素声明自定义权限。实际上,如果您控制这两个应用,请在两个清单中放置相同的 &lt;permission&gt; 元素,这样两个应用的安装顺序就不再重要了。

    【讨论】:

    • 首先包含 也很有帮助。感谢您的回答以及出色的书籍和示例代码。我在 Android 书中没有看到任何使用 的示例代码,所以我在我的书中忽略了它。 (我确实阅读了这一章 - 但我非常“专注于代码”)。
    • @ArtSwri:嗯,你显然正在阅读的书(“Advanced Android”)在一年前被淘汰,其内容折叠到my main book。那本书肯定涵盖了自定义权限的&lt;permission&gt; 元素,因为我在插件示例中使用了它们:github.com/commonsguy/cw-omnibus/tree/master/RemoteViews 话虽如此,谢谢你的好话!
    • 哇,我比我想象的还要落后——我的订阅用完了。现在离开以续订...
    • @CommonsWare 对于你答案的后半部分 - 这不是他对 标签内的 android:permission=... 所做的吗?
    • 删除“android:exported="true" 错误后:从 Android 12 开始,必须设置 android:exported;使用 true 使 Activity 可用于其他应用,否则使用 false
    【解决方案2】:

    尝试在清单中替换它

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

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

    【讨论】:

    • 据我了解,删除 将导致导出默认为 false,这意味着该服务在包含它的应用程序之外不可见。所以我所期望的发生了:启动应用程序中的 startService() 什么都不做 - 没有任何可见的东西可以处理 Intent。 (除了按钮单击方法中的 Log.d 之外,日志中没有任何内容。我非常感谢您的努力,但不认为这实际上是一个解决方案。
    猜你喜欢
    • 2011-10-31
    • 2021-12-13
    • 2012-05-06
    • 2011-11-27
    • 2017-04-18
    • 1970-01-01
    • 2018-12-03
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多