Поиск ближайшего устройства Bluetooth - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь создать приложение для Android для поиска ближайшего устройства Bluetooth, я использую адаптер Bluetooth с широковещательным приемником для поиска ближайших устройств и фильтрации найденных устройств на основе их значения RSSI. Проблема, с которой я сталкиваюсь, заключается в том, что обнаружение устройств занимает слишком много времени, и если я пытаюсь запустить обнаружение в течение короткого периода времени, он не находит все необходимые устройства, например, если у меня есть два устройства и одно из устройств рядом с моим мобильным Android, иногда оно не обнаруживается, но обнаруживается то, которое находится далеко от мобильного телефона.

1 Ответ

0 голосов
/ 06 июля 2018

Это асинхронный процесс, полностью управляемый Android. AFAIK, к сожалению, вы не можете «улучшить» его или «принудительно» каким-либо образом (за исключением, может быть, запуска как root и написания стека BT самостоятельно).

ОБНОВЛЕНИЕ : Первоначально я не задумывался о том, чтобы попытаться включить / выключить функцию Bluetooth.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...