隐式意图的自定义权限

时间:2015-12-04 09:57:00

标签: android broadcastreceiver android-permissions android-security

鉴于Android中的安全模型,我尝试使用广播接收器的自定义权限。

我做了什么

我已经为接收者声明了自定义权限,从而限制了它可以接收的广播。清单中的一些代码:

<permission android:name="abc"/>

<receiver android:name=".UpdateUserReceiver"
        android:permission="abc"
        android:enabled="true"
        android:exported="false">

        <intent-filter>
            <action android:name="android.intent.action.ACTION_UPDATE_USERNAME"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</receiver>

现在我希望接收器 UpdateUserReceiver 只接收来自使用权限的组件的广播&#39; abc&#39;。

广播发送代码:

// Update username. Invoke broadcast.
Intent updateUserBroadcast = new Intent();
updateUserBroadcast.putExtra("username", userName);
updateUserBroadcast.setAction("android.intent.action.ACTION_UPDATE_USERNAME");
sendBroadcast(updateUserBroadcast);

发送广播的活动:

<activity android:name=".UpdateUserNameActivity">

        <intent-filter>
            <action android:name="com.intent.action.UPDATE_USERNAME"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</activity>

问题1: 如图所示,活动无处使用接收方声明的权限,以便它可以从活动接收广播。但仍然调用接收器,我怀疑它是由于隐含意图的使用,虽然我不确定。有什么想法吗?

问题2: 应用级别声明的权限标记与接收者内部的android:permission标记之间的区别是什么?我理解使用第二个,它在任何人都可以期待接收者接收广播之前强制执行许可,但是为什么要求第一个接收广播。是否需要此方案,或者是否可以将其删除。无论哪种方式,我都检查过接收器是否接收到广播。

3 个答案:

答案 0 :(得分:3)

回答1
<uses-permission>中的<manifest>代码请求此应用程序中所有组件的权限,您不需要为单个活动请求权限。并且应用程序声明自定义权限使用<permission>将自动保留它,无需再次请求它。
我猜你的活动和接收器都在同一个应用程序中 &#34;隐含意图&#34;无法违反&#34;权限规则&#34;。

回答2
<permission>中的<application>会设置适用于所有应用程序组件的权限。
点击这里: http://developer.android.com/guide/topics/manifest/application-element.html#prmsn

答案 1 :(得分:2)

  

但仍然调用接收器,我怀疑它是由于使用隐式意图但我不确定

没有

  

有什么想法吗?

他们都在同一个应用程序中(“因为这里我的活动和接收者在同一个应用程序中”)。权限在应用程序之间应用,作为进程间通信(IPC)的一部分,而不是在应用程序中。

  

在应用级别声明的权限标记与接收者内部的android:permission标记之间有什么区别?

<permission>定义权限。 android:permission适用该权限。要绘制Java类比,<permission>定义一个字段,android:permission使用该字段。

答案 2 :(得分:1)

好的,明白了。您可能正在从同一个应用程序发送广播。你试过从不同的应用程序发送广播吗?看看这段代码。有一个PID检查,如果调用PID是相同的应用程序,则默认情况下将授予权限。因此,你的接收器正在执行任何问题。 http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java#2109