我在下面的代码中收到以下警告
hardwareScanBroadcastReceiver 缺少 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED 标志,用于为 IntentFilter 注册的未受保护的广播,无法通过 lint 检查
registerReceiver(
hardwareScanBroadcastReceiver,
scanningHardware.createIntent()
)
但是当我添加 RECEIVER_NOT_EXPORTED 时,我收到这样的警告
字段需要 API 级别 33(当前最低为 26):android.content.Context#RECEIVER_NOT_EXPORTED
最低的SDK版本是26。但是我如何实现registerReceiver并使其向后兼容?
尝试阅读文档,但没有找到任何线索。
您遇到的警告是由于 Android 处理广播接收器的方式发生变化,特别是在安全性和导出方面。从 API 级别 26 开始,Android 对导出的接收器引入了更严格的要求。
为了使您的
registerReceiver
调用向后兼容,您可以在使用新标志之前有条件地检查 API 级别。您可以使用 Build.VERSION.SDK_INT
常数来实现这一点。这是一个例子:
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
class YourClass {
// ...
fun registerReceiver(context: Context, hardwareScanBroadcastReceiver: BroadcastReceiver) {
val intentFilter = scanningHardware.createIntentFilter()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Use the new flag for API level 26 and above
context.registerReceiver(
hardwareScanBroadcastReceiver,
intentFilter,
null,
null,
Context.RECEIVER_NOT_EXPORTED
)
} else {
// Use the old method for API level below 26
context.registerReceiver(hardwareScanBroadcastReceiver, intentFilter)
}
}
// ...
}
在此示例中,代码在使用
Context.RECEIVER_NOT_EXPORTED
标志之前检查 API 级别是否为 26 或更高。对于低于 26 的 API 级别,它会回退到旧的 registerReceiver
方法,而不指定导出标志。
这样,您的代码就可以保持向后兼容,并且可以解决导出接收器的 lint 警告,而不会给运行旧版 Android 版本的设备带来问题。