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

Android应用如何编程读取已连接蓝牙设备的RSSI(信号强度)

Android中读取已连接蓝牙设备RSSI的实现方法

一、必备权限

根据Android版本差异,需配置对应权限:

  • Android 12+:需声明并运行时申请BLUETOOTH_CONNECT权限
  • Android 6~11:需声明并运行时申请ACCESS_FINE_LOCATION,同时补充BLUETOOTH、BLUETOOTH_ADMIN权限

Manifest权限配置示例:

<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" />

二、BLE设备的RSSI读取(主流场景)

如果连接的是BLE设备,通过BluetoothGatt实现:

  1. 确保已通过connectGatt()与设备建立连接(可通过onConnectionStateChange()回调确认连接成功)
  2. 调用BluetoothGatt.readRemoteRssi()发起读取请求
  3. 在BluetoothGattCallback的onReadRemoteRssi()回调中获取RSSI值

代码示例:

// 假设已有已连接的BluetoothGatt实例mBluetoothGatt
mBluetoothGatt.readRemoteRssi();

// 自定义BluetoothGattCallback处理回调
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            // 连接成功后立即读取RSSI
            gatt.readRemoteRssi();
        }
    }

    @Override
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            // rssi为信号强度,单位dBm,范围通常是-30(强)~-100(弱)
            int signalStrength = rssi;
            // 这里处理获取到的RSSI值
        }
    }
};

三、经典蓝牙设备的RSSI读取

针对经典蓝牙(如SPP连接),有两种实现方式:

方式1:监听连接广播获取

注册BluetoothDevice.ACTION_ACL_CONNECTED广播,在设备连接时从Intent中提取RSSI:

private BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            BluetoothDevice connectedDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // 校验是否是目标设备
            if (connectedDevice != null && connectedDevice.getAddress().equals(targetDeviceAddress)) {
                int rssi = intent.getIntExtra(BluetoothDevice.EXTRA_RSSI, Integer.MIN_VALUE);
                if (rssi != Integer.MIN_VALUE) {
                    // 成功获取RSSI
                }
            }
        }
    }
};

// 在Activity onCreate中注册广播
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
registerReceiver(mBluetoothReceiver, filter);

方式2:主动读取(API 18+)

调用BluetoothDevice.readRssi()主动获取,部分设备可能不支持:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
    targetConnectedDevice.readRssi(new BluetoothDevice.ReadRssiCallback() {
        @Override
        public void onReadRssi(int rssi, int status) {
            if (status == BluetoothDevice.READ_RSSI_SUCCESS) {
                // 成功获取RSSI值
            }
        }
    });
}

注意事项

  • RSSI是动态值,建议每隔1~5秒定时读取以获取实时状态
  • 不同设备的RSSI测量精度存在差异,仅作参考
  • 必须确保设备处于已连接状态,否则读取会失败
  • 务必申请并获取对应运行时权限,否则会因权限拒绝导致读取失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:46:05