Bluetooth Low Energy startScan на Android 6.0 не находит устройства

Я разрабатываю приложение с Bluetooth Low Energy с использованием Nexus 5. Это работало на Lollipop, и теперь оно не работает на Зефир. Я установил разрешения ACCESS_COARSE_LOCATION и ACCESS_FINE_LOCATION в манифесте и в runTime в Activity.

Это список ScanFilters:

mScanFilterTest = new ScanFilter.Builder().build();
mScanFilter = new ArrayList<ScanFilter>();
mScanFilter.add(mScanFilterTest);

Это настройки:

mScanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).setReportDelay(0)
                .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).build();

Это мои обратные вызовы:

 mBLEScan = new ScanCallback() {
     @Override
     public void onScanResult(int callbackType, ScanResult result) {
         super.onScanResult(callbackType, result);
         Log.i(TAG, "******************************************");
         Log.i(TAG, "The scan result " + result);
         Log.i(TAG, "------------------------------------------");
         }
     };

Это мой звонок:

mBluetoothLeScanner.startScan(mScanFilter, mScanSettings, mBLEScan);

Запускает сканирование, но не находит устройства. Пожалуйста, помогите мне!!!!

3 ответа

Я боролся с той же проблемой. Чтобы исправить это, вы должны включить "Расположение" (GPS) в настройках телефона, а также запросить разрешение на местоположение в приложении во время выполнения. Оба должны быть сделаны для сканирования, чтобы работать должным образом.

Чтобы запросить разрешение на размещение, введите в диалоговом окне или тому подобное:

yourActivity.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, yourPermissionRequestCode);

и реализовать:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
    if(requestCode == yourPermissionRequestCode)
    {
        ... //Do something based on grantResults
    }
}

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

Intent enableLocationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
yourActivity.startActivityForResult(enableLocationIntent, yourServiceRequestCode);

Вы можете проверить, включил ли пользователь службы определения местоположения, выполнив:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(requestCode == yourServiceRequestCode)
    {
        ...//Do whatever you need to
    }
}

в yourActivity, Вы также можете вручную включить службы определения местоположения, выполнив:

Enter phone settings -> Select "Location" -> Then turn it on

В настройках телефона это должно выглядеть так:

Службы определения местоположения (GPS) включены в настройках телефона

Или вот так в выпадающем меню быстрых настроек:

Службы определения местоположения (GPS) включены в раскрывающихся настройках

Как только пользователь включит разрешение и запустит службы определения местоположения, вам следует начать сканирование. Я заметил, что если вы уже сканируете, когда вы включаете разрешение / включаете службу определения местоположения, она все равно ничего не поместит в ваш onScanResults

Я не уверен, является ли это ошибкой или "функцией" для рекламы iBeacons/Bluetooth (ПРИМЕЧАНИЕ: реклама как при продаже продуктов, а не техническая реклама Bluetooth), чтобы позволить компаниям видеть ваше местоположение и направлять вас туда, куда они хотят.

Надеюсь, это решит вашу проблему!

РЕДАКТИРОВАТЬ Я хотел добавить: вам нужно только это для сканирования. После подключения к устройству BLE вы можете отключить службу определения местоположения на своем телефоне, и вы все равно будете подключены к своим устройствам. Однако вы не сможете обнаружить или подключиться к каким-либо новым устройствам, и все рекламные устройства будут отключены от onScanResults

Как @Jacopo Tosi говорят, что вы должны спросить разрешения на местоположение. Вы можете прочитать здесь, как это сделать. И вы также должны включить Location. Я не знаю, почему это сделал. но это единственный способ, которым мне удалось заставить это работать.

В моем случае (HTC M9) мне также пришлось зайти в меню настроек Android под Bluetooth и вручную сканировать устройства BT.

Другие вопросы по тегам