Activity监听蓝牙连接广播:Android10正常Android14失效求助
问题原因分析(Android 10到14的关键改动)
从Android 12(API 31)开始,蓝牙权限体系发生了拆分,这是导致你在Galaxy S24(Android 14)上收不到ACTION_ACL_CONNECTED/ACTION_ACL_DISCONNECTED广播的核心原因:
权限拆分与废弃
- Android 10及以下,
BLUETOOTH权限涵盖了蓝牙连接、设备发现等所有操作; - Android 12+,系统将蓝牙权限拆分为
BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADVERTISE三个细分权限,原有的BLUETOOTH权限仅作为旧版本兼容标记,不再具备连接相关的权限能力。
- Android 10及以下,
广播过滤规则变更
- Android 12+系统会对蓝牙设备连接/断开的广播(如
ACTION_ACL_CONNECTED)进行权限校验:只有持有BLUETOOTH_CONNECT权限的应用,才能接收到这类广播;无此权限的应用会被系统直接过滤掉相关事件。
- Android 12+系统会对蓝牙设备连接/断开的广播(如
你的代码问题点
- 虽然你在Manifest中声明了
BLUETOOTH_CONNECT权限,但动态申请权限时仅请求了BLUETOOTH权限,未包含BLUETOOTH_CONNECT; - 在Android 14设备上,缺少
BLUETOOTH_CONNECT权限的应用无法获取蓝牙设备连接状态变更的广播,这就是功能失效的直接原因。
修复方案
1. 修正动态权限申请逻辑
针对不同Android版本,兼容申请所需的蓝牙权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ 需要同时申请BLUETOOTH和BLUETOOTH_CONNECT ActivityCompat.requestPermissions(getMainActivity(), new String[]{Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT}, MY_BLUETOOTH_PERMISSION); } else { // Android 11及以下 仅需BLUETOOTH权限 ActivityCompat.requestPermissions(getMainActivity(), new String[]{Manifest.permission.BLUETOOTH}, MY_BLUETOOTH_PERMISSION); }
2. 确保权限授予后再注册广播
建议在权限申请回调(onRequestPermissionsResult)中,确认BLUETOOTH_CONNECT权限已授予后,再注册蓝牙广播接收器,避免因权限未就绪导致的广播接收失败:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == MY_BLUETOOTH_PERMISSION) { boolean hasConnectPermission = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { hasConnectPermission = grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED; } else { hasConnectPermission = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; } if (hasConnectPermission) { // 权限授予成功,注册广播接收器 IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED); filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); registerReceiver(mReceiver, filter); } } }
3. 补充权限声明的版本适配(可选)
在Manifest中可以针对不同版本声明权限,让权限申请更清晰:
<!-- Android 12+ 所需权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31"/> <!-- Android 11及以下 所需权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/>
内容的提问来源于stack exchange,提问作者user3573712
相关产品推荐
相关产品推荐

