在用api级别33构建我的应用程序后,android正在合并的清单中添加新的权限
<permission android:name="com.my.package.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature"/>
<uses-permission android:name="com.my.package.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"/>
我有一个广播接收器,这个许可与此有关吗?我应该更改任何代码吗?有人知道添加此项的原因吗?
<receiver android:enabled="true" android:exported="true" android:name="com.my.package.EventReceiver">
<intent-filter>
<action android:name="com.my.package.event"/>
</intent-filter>
</receiver>
```
来源https://developer.android.google.cn/about/versions/13/features#runtime-接收器:
更安全地导出上下文注册的接收器
为了帮助使运行时接收器更安全,Android 13为您的应用程序引入了指定注册的广播接收器是否应导出并对设备上的其他应用程序可见的功能。在以前版本的Android上,设备上的任何应用程序都可以向动态注册的接收器发送未受保护的广播,除非该接收器受到签名权限的保护。
此导出配置在至少执行以下操作之一的应用程序上可用:
- 使用AndroidX Core库1.9.0或更高版本中的ContextCompat类
- 目标Android 13或更高版本
AndroidManifest.xml中的此节点是用于更安全地导出上下文注册接收器的配置,ContextCompat需要使用此权限来处理广播接收器。
一旦满足了必要的条件,就可以这样使用。有关更多详细信息,请参阅文件
在Gradle中添加依赖项。
dependencies {
val core_version = "1.9.0"
implementation("androidx.core:core:$core_version")
}
应用内代码:
// Create an instance of BroadcastReceiver.
val br: BroadcastReceiver = MyBroadcastReceiver()
// Create an instance of IntentFilter.
val filter = IntentFilter(APP_SPECIFIC_BROADCAST)
// Choose whether the broadcast receiver should be exported and visible to other apps on the device. If this receiver is listening for broadcasts sent from the system or from other apps—even other apps that you own—use the RECEIVER_EXPORTED flag. If instead this receiver is listening only for broadcasts sent by your app, use the RECEIVER_NOT_EXPORTED flag.
val listenToBroadcastsFromOtherApps = false
val receiverFlags = if (listenToBroadcastsFromOtherApps) {
ContextCompat.RECEIVER_EXPORTED
} else {
ContextCompat.RECEIVER_NOT_EXPORTED
}
// Register the receiver by calling registerReceiver():
ContextCompat.registerReceiver(context, br, filter, receiverFlags)
如果你不需要使用这个功能,并且想在AndroidManifest.xml中删除这个节点,你可以这样做:
<uses-permission
android:name="${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
tools:node="remove" />
将以上代码写入AndroidManifest.xml,DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION将在合并清单时被删除
如果其他人正在寻找有关DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
的其他信息,我会在这里找到。
它与androidx.appcompat:appcompat
库绑定,似乎是它们在使用ContextCompat.registerReceiver()
时实现标志ContextCompat.RECEIVER_EXPORTED
和ContextCompat.RECEIVER_NOT_EXPORTED
的方式
我不确定是哪个版本的库引入了这些标志,但1.6.1
确实有这些标志(1.5.1
没有(。只要你的应用程序具有带有这些标志的库依赖项,无论是否使用ContextCompat.registerReceiver()
,都会添加权限。