广播接收器在 android 11 中未收到来自其他应用的意图

Broadcast Receiver not receiving intent from another app in android 11

我正在尝试在 Android 11.

从 App A 向 App B 发送广播

这里是接收端App B:
清单:

<receiver android:name="com.example.my_test.TestReceiver"
    android:enabled="true"
    android:permission="com.example.my_test.broadcast_permission">
    <intent-filter>
        <action android:name="com.example.my_test.receive_action"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

接收者class:

class TestReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("MY_TAG", "received: ${intent?.getIntExtra("data", 0)}")
    }
}

这里是发件人App A:
清单:

<uses-permission android:name="com.example.my_test.broadcast_permission"/>
...
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

发件人代码(在MainActivity内):

findViewById<Button>(R.id.button).setOnClickListener {
    val intent = Intent("com.example.my_test.receive_action")
    intent.addCategory("android.intent.category.DEFAULT")
    intent.component = ComponentName("com.example.my_test", "com.example.my_test.TestReceiver")
    intent.putExtra("data", 69)
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
    sendBroadcast(intent, "com.example.my_test.broadcast_permission")
}

这就是我到目前为止所尝试的一切。也不确定这里是否有任何关于广播许可的错误。没有任何效果,TestReceiver class 从不记录任何内容。

我也试过 android:exported="true"

如果有人知道我在哪里犯了错误,请提供帮助。如果不可能,是否有任何其他方法可以将数据从一个应用程序传递到另一个应用程序?谢谢。

已解决。以下是几点:

  1. 在应用程序 B(接收方)中,还需要在清单顶部的 <permission> 标记中声明权限。我错过了这个。
  2. Category 没有必要。也无需在 sendBroadcast()
  3. 中声明权限
  4. <uses-permission>在App A(发件人)中是必需的。
  5. ComponentName或包名(使用setPackage())需要在Android中提及 11.

这是更正后的代码:

这里是接收端App B:
清单:

<permission android:name="com.example.my_test.broadcast_permission"/>
...
    <application>
    ...
        <receiver android:name="com.example.my_test.TestReceiver"
            android:permission="com.example.my_test.broadcast_permission">
            <intent-filter>
                <action android:name="com.example.my_test.receive_action"/>
            </intent-filter>
        </receiver>
    ...
    </application>
...

接收者class:没有变化。

这里是发件人App A:

清单:无变化

发件人代码(在MainActivity内):

findViewById<Button>(R.id.button).setOnClickListener {
    val intent = Intent("com.example.my_test.receive_action")
    intent.component = ComponentName("com.example.my_test", "com.example.my_test.TestReceiver")
    // if exact receiver class name is unknown, you can use:
    // intent.setPackage("com.example.my_test")
    intent.putExtra("data", 69)
    sendBroadcast(intent)
}