Я пытаюсь использовать функцию 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. Но в конце кажется, что он не работает, он не отправляет обратно устройства.BluetoothLeScanner.startScan с Android 6.0 не обнаруживает устройства
Это мой код:
манифеста
<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);
}
}
EDIT: чтобы решить эту проблему, я только включил GPS. Это легко сделать программно в this way.
У меня такая же проблема. Вы нашли какие-нибудь обходные пути? Я подумываю попробовать новое сканирование api, но больно поддерживать совместимость между ними, поскольку они работают по-разному. –
Да, посмотрите здесь, есть решение: [Bluetooth Low Energy startScan на Android 6.0 не находит устройства] (http://stackoverflow.com/questions/33043582/bluetooth-low-energy-startscan-on-android-6 -0-does-not-find-devices) Однако решение: добавить разрешения в манифест, добавить разрешения в runTime в действие с помощью ScanDevice, включить GPS. Невероятно думать, но моя проблема была в отключенном GPS –
Я только что протестировал его с включенным GPS, и это сработало (я был на планшете, который его отключил). Это безумие, что мы должны включить GPS, чтобы отсканировать BLE, что, если устройство даже не имеет в нем чипа GPS? Ошибка должна быть немедленно отправлена. Я бы подумал, что парни-парни и другие, которые делают BLE-устройства для масс, уже попали бы в Google с этими вопросами. –