【问题标题】:Custom permission failing on Motorola devices摩托罗拉设备上的自定义权限失败
【发布时间】:2012-07-16 19:03:54
【问题描述】:

我为我的小部件编写了接收广播的自定义权限,但我收到了摩托罗拉设备的权限拒绝。

创建权限

<permission
    android:name="com.sample.app.WIDGET_PERMISSION"
    android:description="@string/widgetDesc"
    android:label="@string/widgetLabel"
    android:protectionLevel="signature" >
</permission>

向 Manifest 文件添加权限

    <uses-permission android:name="com.sample.app.WIDGET_PERMISSION" />

添加接收者

    <receiver android:name=".MyWidget" android:label="MyApp"
                android:icon="@drawable/image" 
                android:permission="com.sample.app.WIDGET_PERMISSION">
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                     <category android:name="com.sample.app" />
                </intent-filter>
</receiver>

我只收到摩托罗拉设备的权限拒绝消息,

07-17 11:48:18.781: W/ActivityManager(479): Permission Denial: broadcasting Intent { act=android.appwidget.action.APPWIDGET_ENABLED cmp=com.sample.app/.MyWidget} from android (pid=3116, uid=10006) requires com.sample.app.WIDGET_PERMISSION due to receiver com.sample.app/com.sample.app.MyWidget

07-17 11:48:18.781: W/ActivityManager(479): Permission Denial: broadcasting Intent { act=android.appwidget.action.APPWIDGET_UPDATE cmp=com.sample.app/.MyWidget(has extras) } from android (pid=3116, uid=10006) requires com.sample.app.WIDGET_PERMISSION due to receiver com.sample.app/com.sample.app.MyWidget

07-17 11:48:18.828: W/ActivityManager(479): Permission Denial: broadcasting Intent { act=com.motorola.blur.home.ACTION_SET_WIDGET_SIZE cmp=com.sample.app/.MyWidget(has extras) } from com.motorola.blur.home (pid=3116, uid=10006) requires com.sample.app.WIDGET_PERMISSION due to receiver com.sample.app/com.sample.app.MyWidget

【问题讨论】:

    标签: android broadcastreceiver user-permissions


    【解决方案1】:

    尝试从您的接收者标签中删除android:permission="com.sample.app.WIDGET_PERMISSION",并且只在您的清单标签下包含&lt;uses-permission android:name="com.sample.app.WIDGET_PERMISSION" /&gt;,在任何应用程序和活动之外。

    编辑:问题是广播者应该将权限与广播一起发送,以便它通过您的广播接收器。当您使用命令行对其进行测试时,不知何故,没有发送权限。

    我认为您在接收器内部声明权限的做法是正确的,但问题在于您的权限保护级别是签名。这个级别在 Android 开发者页面中是这样描述的:

    系统仅在请求应用程序时授予的权限 使用与声明的应用程序相同的证书进行签名 许可。如果证书匹配,系统自动 授予权限而不通知用户或请求 用户的明确批准。

    这让我想到,在摩托罗拉设备中,这在某种程度上是不满足的。尝试改变

    android:protectionLevel="signature"
    

    android:protectionLevel="normal".
    

    如果它仍然不起作用,我会说摩托罗拉配置存在错误。

    【讨论】:

    • 然后就可以了。但是拥有这个权限并不是从没有这个权限的发件人那里接收。我的代码适用于三星、Htc 设备,问题仅适用于 Moto DroidX 和 Moto Bionic
    • 来自官方 Android 开发者页面:如果未设置此属性 (android:permission),则 元素的权限属性设置的权限适用于广播接收器。如果两个属性都没有设置,则接收者不受权限保护。
    • 如果应用程序需要访问受权限保护的功能,它必须在清单中使用 元素声明它需要该权限。然后,当应用程序安装在设备上时,安装程​​序通过检查签署应用程序证书的机构并在某些情况下询问用户来确定是否授予请求的权限。如果授予权限,则应用程序可以使用受保护的功能。否则,它访问这些功能的尝试将完全失败,而不会通知用户。
    • 为了测试广播接收器,我使用这个命令发送一个广播,am broadcast -a com.sample.app.WIDGET_REFRESH 如果它正在使用权限,它不应该响应这个命令作为它的不一样的过程。为了防止它接受它,我们需要使用接收器中的权限。如果您查看此站点,developers.google.com/android/c2dm/#manifestGoogle 建议在接收器中使用权限,以便仅接收来自特定接收器的广播。
    • 在某些手机(如仿生)上的摩托罗拉特定设备中似乎存在错误。它在 Atrix 上运行良好。除了删除权限,我没有看到任何解决方案。
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多