2013-03-18 67 views
2

我正在与马克墨菲的优秀Commonsware书 - 但它是很多消化。我构建了“FakePlayer”应用程序(假装成MP3播放器)。它包含一项服务。作为一个学习的经验,我试着写一个简单的应用程序(只有一个按钮),它的点击处理程序:不允许开始服务意图未经许可 - 发件人没有获得许可

Intent i = new Intent(); 
i.setAction("com.example.cwfakeplayer.MyPlayerService"); 
Context context = getApplicationContext(); 
context.startService(i); 

它好工作 - 服务开始OK。我注意到Eclipse的抱怨该服务没有权限,所以我加入2线,Android的更新服务的清单:权限和android:出口:

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

我重新载入播放器应用到设备上(我使用Galaxy S2)在eclipse下使用'debug'。它似乎工作;初学者应用程序导致了我期望的权限异常。

然后我加入到启动应用程序的清单(给它的权限):

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

我重载起动应用到设备上(使用Eclipse下调试)。仍然在初学者应用程序中获得权限错误。

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

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

我做了一个'adb shell dumpsys软件包',它位于初学者应用程序中,并且发现它有'permissionsFixed = false'并且没有'grantedPermissions'部分。我认为这意味着初学者应用程序的清单更改并未设法将该应用程序添加到该应用程序中。但我不知道为什么。作为一种学习体验,它迄今只产生了一些混淆......

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

回答

3

我通过添加2行,机器人更新了服务的清单:权限和机器人:导出

技术上,android:exported="true"是多余的,作为具有<intent-filter>自动使<service>导出。

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

您不会显示您曾在哪里声明<permission>元素的自定义权限。在实践中,如果您同时控制两个应用程序,则在两个清单中都放置相同的<permission>元素,以便安装两个应用程序的顺序不再重要。

+0

它也有助于首先包含。感谢您的回答,以及优秀的书籍和示例代码。我没有看到Android书中使用的任何示例代码,所以我忽略了它(我_did_阅读了这一章 - 但我非常关注代码)。 – 2013-03-18 17:06:53

+0

@ArtSwri:那么你显然正在阅读的这本书(“高级Android”)在一年前已经退役了,其内容已经被折叠到[我的主要书籍](http://commonsware.com)中。 ''元素为自定义权限,因为我在插件示例中使用它们:https://github.com/commonsguy/cw-omnibus/tree/master/RemoteViews这就是说,谢谢你的好话! – CommonsWare 2013-03-18 17:12:17

+0

哇我'米远远落后于ñ我想 - 我的订阅用完了。现在离开去更新... – 2013-03-18 17:17:51

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

如果这不起作用,请上传你的错误替换此。

+0

我的理解是,删除将导致导出默认为false,这意味着该服务在包含它的应用程序之外是不可见的。所以我期望发生的事情:starter app中的startService()什么也不做 - 它没有任何可见的东西来处理Intent。 (Log.d除了Log.d之外没有任何东西在按钮单击的方法中,我很欣赏你的努力,但不要认为它实际上是一个解决方案。 – 2013-03-18 03:59:12