7

鉴于 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 android:name=".UpdateUserNameActivity">

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

Question 1 : 如所见,activity nowhere 使用receiver 声明的权限,以便它可以接收来自activity 的广播。但是仍然调用了接收器,我怀疑这是由于使用了隐式意图,尽管我不确定。有任何想法吗?

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

4

3 回答 3

3

答 1 :
中的<uses-permission>标签<manifest>请求这个应用程序中所有组件的权限,您不需要为单个活动请求权限。并且应用程序声明自定义权限使用<permission>将自动全部持有,无需再次请求。
我猜你的活动和接收者在同一个应用程序中。
“隐含意图”不能打破“许可规则”。

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

于 2015-12-07T02:58:46.903 回答
2

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

不。

有任何想法吗?

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

在应用程序级别声明的权限标记和接收器内部的 android:permission 标记有什么区别?

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

于 2015-12-13T00:46:26.693 回答
1

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

于 2015-12-11T14:37:54.357 回答