在Android 14/SDK 34中使用registerReceiver的正确方法是什么?

问题描述 投票:0回答:1

我在下面的代码中收到以下警告

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并使其向后兼容?

尝试阅读文档,但没有找到任何线索。

https://developer.android.com/guide/components/broadcasts

android kotlin broadcastreceiver
1个回答
0
投票

您遇到的警告是由于 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 版本的设备带来问题。

© www.soinside.com 2019 - 2024. All rights reserved.