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

Android设备BLE扫描异常:仅安装nRF Connect后可发现设备

Android 13及部分全新平板BLE扫描异常:仅安装nRF Connect后可发现设备

我们开发的一款Android BLE扫描连接应用,支持Android 10及以上版本,常规场景下功能正常,但在部分全新平板和搭载Android 13的Galaxy S8设备上出现异常:只有安装nRF Connect应用后,才能正常列出可用BLE设备。当前已声明并授予的权限如下:

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"/>

可能的原因分析

  1. Android 13扫描限制:Android 13对BLE后台扫描管控更严格,nRF Connect的扫描行为可能触发了系统扫描优化机制,而你的应用扫描参数未适配该限制。
  2. 权限配置不完整:虽然声明了BLUETOOTH_SCAN,但Android 13中该权限需明确标记是否关联位置,且动态申请逻辑可能存在疏漏。
  3. 系统BLE服务未初始化:部分全新设备首次启动后,BLE服务可能未完全就绪,nRF Connect的启动触发了服务初始化,间接让你的应用能正常扫描。
  4. 扫描回调处理异常:ScanCallback的实现可能存在兼容性问题,导致扫描结果无法正常接收或展示。

解决方案

1. 调整扫描参数,适配前台扫描模式

Android 13对后台扫描限制更严格,优先使用前台扫描模式确保有效性:

ScanSettings scanSettings = new ScanSettings.Builder()
        .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // 前台低延迟模式
        .build();

暂时移除扫描过滤条件,测试无过滤扫描是否能发现设备,排除过滤规则导致的问题。

2. 完善权限配置与动态申请

  • 在Manifest中为BLUETOOTH_SCAN添加权限标记(若扫描不需要位置信息):
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />
  • 动态申请权限时,同时请求BLUETOOTH_SCAN和BLUETOOTH_CONNECT,确保用户授予:
private static final int REQUEST_BLE_PERMISSIONS = 1001;

// 在启动扫描前申请权限
String[] requiredPermissions = {
        Manifest.permission.BLUETOOTH_SCAN,
        Manifest.permission.BLUETOOTH_CONNECT
};
ActivityCompat.requestPermissions(this, requiredPermissions, REQUEST_BLE_PERMISSIONS);

3. 主动触发BLE服务初始化

在应用启动时,主动初始化BLE适配器并检查蓝牙状态,强制触发系统BLE服务就绪:

BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();

if (bluetoothAdapter == null) {
    // 设备不支持BLE,提示用户
    return;
}

if (!bluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

// 扫描前执行一次短时间扫描,触发服务初始化
bluetoothAdapter.getBluetoothLeScanner().startScan(null, scanSettings, new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        super.onScanResult(callbackType, result);
        bluetoothAdapter.getBluetoothLeScanner().stopScan(this);
    }
});

4. 检查并修复ScanCallback实现

确保ScanCallback所有回调方法正确实现,尤其是onScanFailed用于排查错误:

private ScanCallback bleScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        super.onScanResult(callbackType, result);
        // 将扫描结果添加到展示列表
        addDeviceToList(result.getDevice(), result.getRssi());
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        super.onBatchScanResults(results);
        // 批量处理扫描结果
        for (ScanResult result : results) {
            addDeviceToList(result.getDevice(), result.getRssi());
        }
    }

    @Override
    public void onScanFailed(int errorCode) {
        super.onScanFailed(errorCode);
        // 打印错误日志便于排查
        Log.e("BLE_SCAN", "扫描失败,错误码:" + errorCode);
    }
};

5. 验证BLE功能可用性

扫描前检查设备是否支持BLE:

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    // 设备不支持BLE,提示用户
    Toast.makeText(this, "设备不支持BLE功能", Toast.LENGTH_SHORT).show();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:42:13