Как искать устройства Bluetooth?

#android #bluetooth #android-bluetooth

#Android #bluetooth #android-bluetooth

Вопрос:

Я хочу создать приложение, которое сканирует локальные устройства Bluetooth. Приложение находит все сопряженные устройства, но не спаренные устройства. У меня есть кнопка, и когда я нажимаю ее, я хочу видеть в Log найденных устройствах.

В AndroidManifest я добавил разрешения для BLUETOOTH , BLUETOOTH_ADMIN и ACCESS_COARSE_LOCATION .

onCreate Я получаю адаптер Bluetooth по умолчанию и получаю сопряженные устройства.

 protected void onCreate(Bundle savedInstanceState) {
....
    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if(!bluetoothAdapter.isEnabled()) {
            Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enable, REQUEST_ENABLE_BT);
        }
    pairedDevices = bluetoothAdapter.getBondedDevices();
        ///Add paired Devices
        for(BluetoothDevice device : pairedDevices){
            Log.i("DEVICE", device.getAddress() " " device.getName());
            devicesList.add(device);
        }
}
  

При onClick выполнении scanDevices функции, в которой я использую ScanCallBack .

 final ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
       super.onScanResult(callbackType, result);
       if(!devicesList.contains(result.getDevice())) {
          Log.i("DEVICE", result.getDevice().getName()  "  " result.getDevice().getAddress());
          devicesList.add(result.getDevice());
                }
            }
            @Override
            public void onScanFailed(int errorCode) {
                super.onScanFailed(errorCode);
            }
        };

 bluetoothAdapter.getBluetoothLeScanner().startScan(scanCallback);
 new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
              bluetoothAdapter.getBluetoothLeScanner().stopScan(scanCallback);     
            }
        }, 10000);
}
  

Когда я запускаю приложение, оно ничего не делает, ни одно устройство не отображается в журнале, и когда я пытаюсь его отладить, оно даже не останавливается в ScanCallback.

Комментарии:

1. Знаете ли вы, почему он не находит все устройства при первом сканировании?

Ответ №1:

Начиная с Android 6.0 / Marshmallow, для любого сканирования Bluetooth требуются два следующих условия:

  1. Разрешение на местоположение (ACCESS_COARSE_LOCATION пока достаточно, но, по-видимому, не в бета-версии Android Q);
  2. Службы определения местоположения включены и включены.

Таким образом, это означает, что на любом устройстве под управлением Android 6 или next вы должны использовать систему запроса разрешений во время выполнения, чтобы попросить пользователя предоставить вам доступ к его местоположению. Но этого недостаточно, пользователь также должен включить свою службу определения местоположения (точность не проблема).

Вы можете добиться этого либо с помощью служб Google Play, чтобы показать всплывающее окно с просьбой к пользователю включить службы определения местоположения, либо перенаправить на службы определения местоположения в приложении «Настройки», где пользователь может включить службу определения местоположения своего устройства.

Как только оба условия будут выполнены, устройства начнут отображаться в журналах, если они, конечно, находятся в зоне действия.

Примечание: это также справедливо для простого обнаружения Bluetooth с помощью Bluetooth Classic.

Комментарии:

1. Знаете ли вы, почему он не находит все устройства при первом сканировании?

2. Добро пожаловать! Я предполагаю, что при первом сканировании возможно, что в зависимости от аппаратного обеспечения это может произойти. Известно, что низкое энергопотребление на Android всегда было нестабильным, и с учетом разнообразия существующих устройств это неудивительно.

3. У меня есть еще один вопрос, вы знаете, почему он продолжает отключаться через несколько мгновений?

4. Что вы имеете в виду под отключением? Вы имеете в виду, что вы установили соединение с файловым устройством, и это соединение закрывается через некоторое время?

5. Да, именно это