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

Activity监听蓝牙连接广播:Android10正常Android14失效求助

问题原因分析(Android 10到14的关键改动)

从Android 12(API 31)开始,蓝牙权限体系发生了拆分,这是导致你在Galaxy S24(Android 14)上收不到ACTION_ACL_CONNECTED/ACTION_ACL_DISCONNECTED广播的核心原因:

  1. 权限拆分与废弃

    • Android 10及以下,BLUETOOTH权限涵盖了蓝牙连接、设备发现等所有操作;
    • Android 12+,系统将蓝牙权限拆分为BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADVERTISE三个细分权限,原有的BLUETOOTH权限仅作为旧版本兼容标记,不再具备连接相关的权限能力。
  2. 广播过滤规则变更

    • Android 12+系统会对蓝牙设备连接/断开的广播(如ACTION_ACL_CONNECTED)进行权限校验:只有持有BLUETOOTH_CONNECT权限的应用,才能接收到这类广播;无此权限的应用会被系统直接过滤掉相关事件。
你的代码问题点
  • 虽然你在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:25:17