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

Target SDK32的Android BLE应用能否兼容Android11及更低版本?

Android BLE应用适配Android11与Android12+的权限问题解决方案

目标SDK设为32的应用完全可以在Android11或更低版本设备上运行,你的问题根源是权限检查逻辑没有区分系统版本,错误地在低版本设备上校验了Android12+才引入的BLUETOOTH_CONNECT权限。

权限适配核心逻辑

Android不同版本的BLE权限体系差异很大,必须严格按版本分支处理:

  • Android12+(API31及以上):
    • 新增BLUETOOTH_SCAN、BLUETOOTH_CONNECT、BLUETOOTH_ADVERTISE三个细分权限,均需动态申请
    • 不再需要位置权限(除非扫描用于定位)
  • Android11及以下(API30及以下):
    • 使用旧权限BLUETOOTH、BLUETOOTH_ADMIN,这两个是普通权限,安装时自动授予,无需动态申请
    • 扫描BLE设备需要动态申请ACCESS_FINE_LOCATION权限(系统要求通过位置权限管控BLE扫描)
    • 不存在BLUETOOTH_CONNECT权限,如果代码中检查这个权限,系统会直接返回权限拒绝

你的代码问题分析

你在获取设备名称、调用BluetoothGatt功能时,直接检查了BLUETOOTH_CONNECT权限,但没有判断系统版本:

if (ActivityCompat.checkSelfPermission(m_context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
    return;
}
String sDevicename = device.getName();

在Android11设备上,系统根本不认识BLUETOOTH_CONNECT权限,checkSelfPermission会直接返回PERMISSION_DENIED,导致代码执行return,功能无法正常运行。

代码修改方案

1. 修正权限检查逻辑

所有涉及BLUETOOTH_CONNECT的权限检查,都必须先判断系统版本是否为Android12+:

// 获取设备名称的权限检查
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    if (ActivityCompat.checkSelfPermission(m_context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
        // Android12+ 动态申请BLUETOOTH_CONNECT权限
        requestConnectPermissionLauncher.launch(Manifest.permission.BLUETOOTH_CONNECT);
        return;
    }
}
// Android11及以下无需检查BLUETOOTH_CONNECT,直接执行
String sDevicename = device.getName();

2. 补充BLUETOOTH_CONNECT的动态申请逻辑

可以复用现有ActivityResultLauncher,或新增专门处理CONNECT权限的Launcher:

// 新增BLUETOOTH_CONNECT权限申请Launcher
private final ActivityResultLauncher<String> requestConnectPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                Log.d("MAIN", "BLUETOOTH_CONNECT权限已授予");
                // 权限授予后,重新执行之前被拦截的操作(比如获取设备名称、连接Gatt)
                retryPendingOperation();
            } else {
                Log.d("MAIN", "BLUETOOTH_CONNECT权限被拒绝");
                Toast.makeText(m_context, "需要蓝牙连接权限才能获取设备信息", Toast.LENGTH_SHORT).show();
            }
        });

3. 优化清单文件权限配置

你的清单文件已有基础配置,可优化位置权限的版本限制,避免在Android12+上申请不必要的权限:

<!-- Android11及以下的蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />

<!-- 位置权限:仅在Android11及以下需要,添加maxSdkVersion -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />

<!-- Android12+的蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" 
    android:usesPermissionFlags="neverForLocation" 
    tools:targetApi="s" />

<!-- 后台位置权限:仅当需要后台扫描BLE时才保留,否则可移除 -->
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:maxSdkVersion="30" /> -->

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

4. BluetoothGatt连接的权限检查修正

连接Gatt时同样需要区分版本:

private void connectToGatt(BluetoothDevice device) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        if (ActivityCompat.checkSelfPermission(m_context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
            requestConnectPermissionLauncher.launch(Manifest.permission.BLUETOOTH_CONNECT);
            return;
        }
    }
    // Android11及以下直接连接
    BluetoothGatt gatt = device.connectGatt(m_context, false, gattCallback);
}

关键注意事项

  • 不要在Android11及以下设备上申请或检查BLUETOOTH_CONNECT、BLUETOOTH_SCAN这些新权限,系统会识别为无效权限
  • Android11及以下扫描BLE必须确保位置权限已授予,否则扫描不会返回结果
  • 如果应用需要在后台扫描BLE,Android10及以上需要申请ACCESS_BACKGROUND_LOCATION权限,但仅在低版本设备上处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:17:58