Как искать устройства Bluetooth? - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу создать приложение, которое сканирует локальные устройства 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 голос
/ 12 апреля 2019

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

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

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

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

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

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

...