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
В настройках телефона это должно выглядеть так:
Или вот так в выпадающем меню быстрых настроек:
Как только пользователь включит разрешение и запустит службы определения местоположения, вам следует начать сканирование. Я заметил, что если вы уже сканируете, когда вы включаете разрешение / включаете службу определения местоположения, она все равно ничего не поместит в ваш onScanResults
Я не уверен, является ли это ошибкой или "функцией" для рекламы iBeacons/Bluetooth (ПРИМЕЧАНИЕ: реклама как при продаже продуктов, а не техническая реклама Bluetooth), чтобы позволить компаниям видеть ваше местоположение и направлять вас туда, куда они хотят.
Надеюсь, это решит вашу проблему!
РЕДАКТИРОВАТЬ Я хотел добавить: вам нужно только это для сканирования. После подключения к устройству BLE вы можете отключить службу определения местоположения на своем телефоне, и вы все равно будете подключены к своим устройствам. Однако вы не сможете обнаружить или подключиться к каким-либо новым устройствам, и все рекламные устройства будут отключены от onScanResults
Как @Jacopo Tosi говорят, что вы должны спросить разрешения на местоположение. Вы можете прочитать здесь, как это сделать. И вы также должны включить Location. Я не знаю, почему это сделал. но это единственный способ, которым мне удалось заставить это работать.
В моем случае (HTC M9) мне также пришлось зайти в меню настроек Android под Bluetooth и вручную сканировать устройства BT.