You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 14/SDK34中registerReceiver用法及minSDK26兼容方案

解决方案

要在minSdk=26的项目中兼容registerReceiver的导出标记要求,需通过API版本判断调用不同的方法重载,同时消除lint警告:

核心实现逻辑

RECEIVER_NOT_EXPORTED(及RECEIVER_EXPORTED)是Android 13(API 33)新增的常量,因此需要分版本处理:

  • 在API 33及以上系统:调用带标记参数的registerReceiver重载,传入RECEIVER_NOT_EXPORTED(如果你的广播不需要对外暴露)
  • 在API 33以下系统:使用无标记参数的旧版方法,因为低版本系统本身不要求这个标记

代码示例

Kotlin 实现

val receiver = hardwareScanBroadcastReceiver
val intentFilter = scanningHardware.createIntent()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    registerReceiver(receiver, intentFilter, Context.RECEIVER_NOT_EXPORTED)
} else {
    registerReceiver(receiver, intentFilter)
}

Java 实现

BroadcastReceiver receiver = hardwareScanBroadcastReceiver;
IntentFilter intentFilter = scanningHardware.createIntent();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    registerReceiver(receiver, intentFilter, Context.RECEIVER_NOT_EXPORTED);
} else {
    registerReceiver(receiver, intentFilter);
}

消除Lint警告

如果lint仍对低版本的调用发出警告,可添加@SuppressLint("UnspecifiedRegisterReceiverFlag")注解屏蔽:

@SuppressLint("UnspecifiedRegisterReceiverFlag")
private fun registerScanReceiver() {
    // 上述版本判断代码
}

关键说明

  • 如果你的广播接收器需要接收其他应用发送的广播,在API33+时应传入RECEIVER_EXPORTED;反之用RECEIVER_NOT_EXPORTED更安全
  • 低版本系统(API<33)没有强制要求标记,直接调用旧方法既符合系统行为,也不存在安全隐患

内容的提问来源于stack exchange,提问作者C0NTRERAS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:06:10