具有隐式意图的自定义权限

Custom permission with implicit intent

鉴于 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 将只接收来自使用权限 'abc' 的组件的广播。

广播发送代码:

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

Activity 发送广播:

<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: 可以看出,activity 没有使用接收者声明的权限,因此它可以接收来自 activity 的广播。但是仍然调用了接收器,我怀疑这是由于使用了隐式意图,但我不确定。有什么想法吗?

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

回答 1:
<manifest> 中的 <uses-permission> 标记请求此应用程序中所有组件的权限,您不需要为单个 activity 请求权限。并且应用程序声明自定义权限使用 <permission> 将自动持有它,无需再次请求。
我猜你的 activity 和接收器在同一个应用程序中。
"implicit intents"打不开"permission rule".

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

好的,明白你的意思了。您可能正在从同一个应用程序发送广播。您是否尝试过从不同的应用程序发送广播?看看这段代码。如果调用 PID 是同一个应用程序,则会进行 PID 检查,然后默认授予权限。因此,您的接收器正在毫无问题地执行。 http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java#2109

But still the receiver is invoked, and I suspect it's due to the use of implicit intents though I'm not sure

没有

Any ideas?

它们都在同一个应用程序中 ("because here my activity and receiver are in the same application")。权限在应用程序之间应用,作为进程间通信 (IPC) 的一部分,而不是在应用程序内。

What's the difference between the permission tag declared at app level, and android:permission tag inside the receiver?

<permission> 定义权限。 android:permission 应用权限。打个Java类比,<permission>定义一个字段,android:permission使用字段