寻找最近的蓝牙设备

时间:2018-07-06 06:56:10

标签: android bluetooth

我正在尝试构建一个android应用程序以查找最近的蓝牙设备,我正在使用具有广播接收器的蓝牙适配器来查找附近的设备并根据其RSSI值过滤找到的设备。我面临的问题是发现设备所需的时间太长,如果我尝试在短时间内运行发现,它将找不到所有必需的设备,例如,如果我有两个设备并保持靠近我的android移动设备的设备之一,有时无法检测到,但远离移动设备的设备却被检测到了。

1 个答案:

答案 0 :(得分:0)

这是一个完全由Android管理的异步过程。不幸的是,AFAIK不能“改善”或以任何方式“强制”(除了以root用户身份运行和自己编写BT堆栈外)。

更新:我最初没有想到的一件事就是尝试打开/关闭蓝牙功能。

private static BroadcastReceiver btReceiver = null;

// ..

void toggleRefreshBluetooth ()
{
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter ();

    if (mBluetoothAdapter.isEnabled ())
    {
        mBluetoothAdapter.disable ();
    }
}


// ... in onCreate

btReceiver = new BroadcastReceiver ()
{
    @Override
    public void onReceive (Context context, Intent intent)
    {
        if (intent != null && BluetoothAdapter.ACTION_STATE_CHANGED.equals (intent.getAction ()))
        {
                final int state = intent.getIntExtra (BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
                switch (state)
                {
                    case BluetoothAdapter.STATE_OFF:
                        // Bluetooth has been turned off
                        mBluetoothAdapter.enable ();
                        break;
                    case BluetoothAdapter.STATE_TURNING_OFF:
                        // Bluetooth is turning off
                        break;
                    case BluetoothAdapter.STATE_ON:
                        // Bluetooth has been on
                        break;
                    case BluetoothAdapter.STATE_TURNING_ON:
                        // Bluetooth is turning on
                        break;
                }
         }
    }
};

final IntentFilter filter = new IntentFilter ();
filter.addAction (BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver (btReceiver, filter);

呼叫toggleRefreshBluetooth可能会强制重新扫描。尝试一下,除非您的情况不方便。

不要求该应用程序为系统应用程序,并且您无需扎根手机。您唯一需要的是Manifest.permission.BLUETOOTH_ADMIN权限。