BluetoothLescan() не находит никаких устройств

У меня возникли проблемы с поиском устройств через Bluetooth на моем Samsung Galaxy s5.

Я на Android 6.0 и установил разрешения для моего приложения на сканирование следующим образом:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            // Android M Permission check
            if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("This app needs location access");
                builder.setMessage("Please grant location access so this app can devices.");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                    public void onDismiss(DialogInterface dialog) {
                        requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
                    }
                });

                builder.show();
            }

Я предполагаю, что это работает правильно, потому что я получил всплывающее окно с запросом разрешений, которые я принял.

Моя функция сканирования:

private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    Log.i("start" , "Stopping scan...");
                    mBluetoothLeScanner.stopScan(mScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            Log.i("start" , "Starting scan...");
            mBluetoothLeScanner.startScan(mScanCallback);
        } else {
            mScanning = false;
            mBluetoothLeScanner.stopScan(mScanCallback);
        }

    }

Теперь он останавливается и начинает сканирование правильно, так как Logcat дает мне журналы. Но он просто не находит никаких устройств, что действительно странно, потому что я сижу рядом со своим ноутбуком и вторым телефоном с включенным Bluetooth.

Вот, кстати, мой обратный вызов, если кому интересно:

Private ScanCallback mScanCallback = new ScanCallback() {

    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        System.out.println("BLE// onScanResult");
        Log.i("callbackType", String.valueOf(callbackType));
        Log.i("result", result.toString());
        BluetoothDevice btDevice = result.getDevice();
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        System.out.println("BLE// onBatchScanResults");
        for (ScanResult sr : results) {
            Log.i("ScanResult - Results", sr.toString());
        }
    }

    @Override
    public void onScanFailed(int errorCode) {
        System.out.println("BLE// onScanFailed");
        Log.e("Scan Failed", "Error Code: " + errorCode);
    }
};

Теперь, как вы можете видеть, сканирование не завершается ошибкой, поскольку Logcat не дает мне журнал ошибок сканирования, но, по-видимому, также не находит никаких устройств...

Логкат:

06-07 17:13:02.622 16802-16802/com.example.joey.findmycar I/start: Starting scan...
06-07 17:13:02.802 16802-16802/com.example.joey.findmycar W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
06-07 17:13:02.882 16802-16802/com.example.joey.findmycar I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@c8fddba time:699666571
06-07 17:13:14.632 16802-16802/com.example.joey.findmycar I/start: Stopping scan...

Я добавил правильные разрешения в свой манифест:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />

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


person joey    schedule 07.06.2016    source источник
comment
Поскольку вы пробовали на Android 6, вы также пытались дать разрешение на определение местоположения, так как начиная с Android 6 местоположение должно быть включено при сканировании устройств BLE. Поэтому вам также нужно запросить разрешение на выполнение для определения местоположения.   -  person Gautam    schedule 07.06.2016
comment
Убедитесь, что службы определения местоположения также включены (Настройки › Местоположение › Вкл.), так как если они отключены, вы не получите никаких результатов сканирования, даже если у вас есть разрешение на определение местоположения.   -  person Kevin Coppock    schedule 07.06.2016
comment
Похоже, вы установили тайм-аут примерно на 10 секунд, верно? Что произойдет, если вы просто отпустите его, пока не будет вызван один из обратных вызовов?   -  person Daniel Nugent    schedule 07.06.2016
comment
@kcoppock Я пытался включить это, но, похоже, это не имеет значения, при сканировании все еще нет результатов.   -  person joey    schedule 07.06.2016
comment
@DanielNugent Раньше вы сканировали около 10 секунд, пытались увеличить его до 100, ничего не изменилось.   -  person joey    schedule 07.06.2016
comment
@Gautam Итак, я попытался дать разрешения во время выполнения для ACCESS_LOCATION_EXTRA_COMMANDS, но это, похоже, ничего не меняет, теперь у приложения есть разрешение, но результатов по-прежнему нет.   -  person joey    schedule 07.06.2016
comment
@joey, просто добавив разрешение в манифест, оно не будет работать, вы должны явно запрашивать его через код во время выполнения.   -  person Gautam    schedule 08.06.2016
comment
Является ли ваш ноутбук или другой мобильный телефон сервером BLE? Я имею в виду, есть ли у них ГАТТ? Возможно, это проблема, если у них нет GAP, они могут не распознаваться как устройства BLE.   -  person SamuelPS    schedule 16.06.2016


Ответы (3)


Ваш код должен работать нормально, если вы сканируете устройства BLE, такие как пульсометр или датчик приближения. Проблема может заключаться в том, что с этим кодом ваше приложение является клиентом GATT и ищет сервер GATT.

Поэтому, если вы хотите подключиться к другому телефону, вы можете написать серверное приложение GATT и запустить его на другом телефоне (как указано в последнем абзаце здесь)

person Katharina    schedule 14.06.2016

Я нашел это в обновлениях API Android 6.0:

Улучшенное сканирование Bluetooth с низким энергопотреблением

Если ваше приложение выполняет сканирование Bluetooth с низким энергопотреблением, используйте новый метод setCallbackType(), чтобы указать, что вы хотите, чтобы система уведомляла об обратных вызовах, когда она впервые находит или видит после длительного времени пакет рекламы, соответствующий заданному ScanFilter. Такой подход к сканированию более энергоэффективен, чем тот, что был реализован в предыдущей версии платформы.

person solosodium    schedule 07.06.2016

Есть полный документ от Google, вы его просматриваете:

https://developer.android.com/guide/topics/connectivity/bluetooth-le.html

person Sanat Chandravanshi    schedule 16.06.2016