Подтвердить что ты не робот

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

Я разрабатываю приложение с Bluetooth Low Energy, используя Nexus 5. Он работал на Lollipop, и теперь он не работает на Marshmallow. Я установил разрешения 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);

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

4b9b3361

Ответ 1

Я боролся с той же проблемой. Чтобы исправить это, вы должны включить "Местоположение" (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. Вы также можете вручную включить службы местоположения (GPS), выполнив следующие действия:

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

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

Location (GPS) services enabled in Phone Settings

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

Location (GPS) services enabled in drop down settings

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

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

Надеюсь, что эта проблема устранена!

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

Ответ 2

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

Ответ 3

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