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

Android 10:如何获取未连接BLE设备的RSSI值?

BLE扫描无法触发ScanCallback的排查方案

问题描述

布局包含Button和TextView,目标是无需连接BLE设备即可获取周边设备的RSSI用于定位,但代码中的ScanCallback从未被触发,无法获取RSSI值。

排查与解决步骤

  • 权限配置与动态申请
    Android不同版本对BLE权限要求不同,必须确保权限齐全:

    1. 在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" />
      
    2. 动态申请权限:除了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):扫描已启动,重复调用startScan
    • SCAN_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);
    
  • 环境与设备兼容性检查

    1. 确认测试环境中有正在广播的BLE设备(比如用另一台手机开启BLE广播测试)
    2. Android 10及以上版本对后台BLE扫描有严格限制,若需后台扫描,需使用前台服务
    3. 部分厂商定制系统对BLE扫描有额外限制,可尝试在其他设备上测试代码

内容的提问来源于stack exchange,提问作者Marc Ledesma Chivite

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:45:36