Intereting Posts
Запустить контрольно-измерительный тест с использованием Espresso: класс ref в предварительно проверенном классе разрешен к неожиданному выполнению Как я могу создать Android Sample Project в Android Studio Когда нужно вызвать response.body (). Close () HTC One X – Webview становится белым / пустым после касания Консоль разработчика Google Play: бесплатное бета-тестирование платных приложений? Как делиться одними и теми же данными между несколькими действиями в android? Ошибка раздувания TextInputLayout при использовании с ViewPager Отмена ожидающего действия React Native: TouchableOpacity onPress проблемы внутри ScrollView Очистить буфер обмена на SGS2 (api 10) Размер фонового изображения активности Android Захват изображения без разрешения с Android 6.0 Селектор вкладок не работает на предыдущей вкладке, щелкая при прокрутке на просмотрщике Панель поиска Android с пользовательским палец с динамическим текстом внутри Как скрыть мягкую клавиатуру внутри фрагмента?

BluetoothLeScanner.startScan с Android 6.0 не обнаруживает устройств

Я пытаюсь использовать функцию BluatoothLeScanner.startScan вместо устаревшего BluetoothAdapter.startLeScan . Вчера я обновил свой Nexus 5 до Android 6.0, и с этого момента мое приложение больше не работает. Сначала я добавляю предпочтения, необходимые для ACCESS_COARSE_LOCATION, как показано здесь: https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id . Затем я добавил разрешение, как описано здесь: https://developer.android.com/training/permissions/requesting.html . Но в конце кажется, что он не работает, он не отправляет обратно устройства.

Это мой код:

манифест

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.stm.sensitronapp"> <uses-sdk android:maxSdkVersion="23"/> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>` 

DeviceScanActivity

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) { } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_COARSE); } } // Device scan callback. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { mScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); mLeDeviceListAdapter.addDevice(result.getDevice()); mLeDeviceListAdapter.notifyDataSetChanged(); } }; } } } final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) { mSwipeRefreshLayout.setRefreshing(true); mLeDeviceListAdapter.clear(); mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION ) == PackageManager.PERMISSION_GRANTED) { mBluetoothLeScanner.startScan(mScanCallback); } } 

Solutions Collecting From Web of "BluetoothLeScanner.startScan с Android 6.0 не обнаруживает устройств"

Если предоставлены разрешения, попробуйте: включите GPS.

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

Также вы можете проверить это, чтобы проверить, работает ли ваше приложение нормально:

Откройте «Настройки»> «Приложения»> «Приложение»> «Разрешения» и включите «Местоположение», а затем попытайтесь найти результаты.

Местоположение будет указано в разрешениях только в том случае, если вы предоставили ACCESS_COARSE_LOCATION в манифесте.

Использование вышеприведенных решений работает, но побочным эффектом является то, что вам нужно включить службы определения местоположения для чего-то, что ему не нужно. Уродливая и неудовлетворительная работа заключается в том, чтобы указать целевую версию в вашем манифесте

Android: targetSdkVersion = "21"

Он позволяет сканировать мой Nexus 7, хотя установленная версия 6.0.1. Я не знаю, какие побочные эффекты нацелены на более низкую версию, чем на установленную версию, но, по крайней мере, сканирование работает. Может быть единственным решением для устройств без GPS (если такие устройства существуют).

Google должен быть распят за это.

Один из непонятных ответов заключается в том, что вы по-прежнему можете использовать тот же метод метода сканирования BT, как только вы включите новое разрешение на размещение в режиме реального времени.

  mBluetoothAdapter.startDiscovery(); 

…….

 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); mDeviceList.add(device); } } }; 

Это старый вопрос, но я отвечу, чтобы помочь кому-то.
К сожалению, комбинация ACCESS_COARSE_LOCATION и targetSdkVersion 22 не работает на некоторых устройствах.
Это не очень хороший метод, но я решил его следующим образом, не используя разрешения во время выполнения (ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION)

  1. Установите «targetSdkVersion» в 19 (я думаю, возможно, api19 ~ api22 будет возможно)
  2. Добавьте в файл манифеста следующее разрешение

     <uses-permission android:name="android.permission.READ_OWNER_DATA" /> <uses-permission android:name="android.permission.WRITE_OWNER_DATA" /> 

Протестирован на Android 4.4 ~ 7.1.1