Android 10:如何获取未连接BLE设备的RSSI值?
BLE扫描无法触发ScanCallback的排查方案
问题描述
布局包含Button和TextView,目标是无需连接BLE设备即可获取周边设备的RSSI用于定位,但代码中的ScanCallback从未被触发,无法获取RSSI值。
排查与解决步骤
权限配置与动态申请
Android不同版本对BLE权限要求不同,必须确保权限齐全:- 在
AndroidManifest.xml中声明必要权限:<!-- 基础BLE权限 --> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 12+ 扫描权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 低版本Android(11及以下)需要位置权限才能扫描BLE --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" /> - 动态申请权限:除了
BLUETOOTH_SCAN,还需申请位置权限(部分系统强制要求位置开启才能扫描BLE),可在按钮点击前补充权限检查:String[] permissions = { Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.ACCESS_FINE_LOCATION }; if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, permissions, 1001); return; }
- 在
蓝牙状态校验
确保设备蓝牙已开启,代码中可添加判断并引导用户开启:if (mBluetoothAdapter == null) { // 设备不支持BLE mTextView.setText("设备不支持BLE"); return; } if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 1002); }完善ScanCallback的错误回调
重写onScanFailed方法,获取扫描失败的错误码,直接定位问题:mScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); int rssi = result.getRssi(); // 确保在主线程更新UI runOnUiThread(() -> mTextView.setText("RSSI: " + rssi)); } @Override public void onScanFailed(int errorCode) { super.onScanFailed(errorCode); runOnUiThread(() -> mTextView.setText("扫描失败,错误码:" + errorCode)); } };常见错误码含义:
SCAN_FAILED_ALREADY_STARTED(1):扫描已启动,重复调用startScanSCAN_FAILED_APPLICATION_REGISTRATION_FAILED(2):应用注册扫描失败,可能是权限问题SCAN_FAILED_INTERNAL_ERROR(3):系统内部错误
优化扫描参数
使用ScanSettings配置扫描模式,提升扫描灵敏度,比如设置低延迟模式:ScanSettings scanSettings = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // 低延迟模式,适合前台扫描 .build(); // 传入null表示扫描所有BLE设备,也可指定ScanFilter过滤特定设备 mBluetoothLeScanner.startScan(null, scanSettings, mScanCallback);环境与设备兼容性检查
- 确认测试环境中有正在广播的BLE设备(比如用另一台手机开启BLE广播测试)
- Android 10及以上版本对后台BLE扫描有严格限制,若需后台扫描,需使用前台服务
- 部分厂商定制系统对BLE扫描有额外限制,可尝试在其他设备上测试代码
内容的提问来源于stack exchange,提问作者Marc Ledesma Chivite
相关产品推荐
相关产品推荐

