具有权限级别签名的Android广播接收器不接收广播

Posted

技术标签:

【中文标题】具有权限级别签名的Android广播接收器不接收广播【英文标题】:Android Broadcast Reciever with permissionLevel signature not receiving broadcasts 【发布时间】:2021-07-14 23:35:15 【问题描述】:

我有 2 个应用程序 signprotectbroadcastbroadcastsender

signprotectbroadcast中,我注册了一个Receiver

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.signprotectbroadcast">
<permission android:name="PERMISSION_OP"
    android:protectionLevel="signature"
    android:label="PERMISSION">
</permission>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.SignProtectBroadcast">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <receiver android:name=".MyReciever"
        android:enabled="true"
        android:exported="true"
        tools:ignore="ExportedReceiver"
        android:permission="PERMISSION_OP">
        <intent-filter>
            <action android:name="ACTION_OP" />
        </intent-filter>
    </receiver>
</application>
</manifest>

在应用程序broadcastsender中我请求Manifest

中的权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastsender">
<uses-permission android:name="PERMISSION_OP"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.BroadCastSender">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

并像这样发送广播

    sendBtn.setOnClickListener 
        val intent = Intent()
        intent.action = "ACTION_OP"
        intent.component = ComponentName("com.example.signprotectbroadcast", "com.example.signprotectbroadcast.MyReciever" )
        sendBroadcast(intent, "PERMISSION_OP")
    

在运行发布版本变体时,我还创建了一个常见的 keystore,但这根本不起作用,尝试了所有方法。

一旦我从 receiver 块以及 sendBroadCast 函数中删除 permission,就会正确接收 broadcast

谁能指出我在哪里调试为什么没有收到这个广播或者如何调试这个?

【问题讨论】:

添加到发送方和接收方。 不行不行。 为什么需要 ?只需删除它并在发送时执行 sendBroadcast(intent) 【参考方案1】:

发送广播的应用需要声明权限,以及声明它使用的权限;

发送应用:broadcastsender(声明并使用权限)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastsender">

    <permission android:name="PERMISSION_OP"
    android:protectionLevel="signature"
    android:label="PERMISSION"/>

    <uses-permission android:name="PERMISSION_OP"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.BroadCastSender">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

用法:

sendBtn.setOnClickListener 
        val intent = Intent()
        intent.action = "ACTION_OP"
        intent.component = ComponentName("com.example.signprotectbroadcast", "com.example.signprotectbroadcast.MyReciever" )
        sendBroadcast(intent, "PERMISSION_OP")
    

接收应用:signprotectbroadcast(仅使用权限)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.signprotectbroadcast">

<uses-permission android:name="PERMISSION_OP"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.SignProtectBroadcast">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <receiver android:name=".MyReciever"
        android:enabled="true"
        android:exported="true"
        tools:ignore="ExportedReceiver"
        android:permission="PERMISSION_OP">
        <intent-filter>
            <action android:name="ACTION_OP" />
        </intent-filter>
    </receiver>
</application>
</manifest>

【讨论】:

以上是关于具有权限级别签名的Android广播接收器不接收广播的主要内容,如果未能解决你的问题,请参考以下文章

用于应用权限的 Android 广播接收器

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

Android 广播 - 使用权限发送和接收

用户在Android应用中停用位置权限时的广播接收器?

如何在没有权限的android 6中使用广播接收器启动应用程序

私人广播发送者和接收者权限