Функция onLeScan не вызывается при попытке обнаружить устройства BLE
Я пытаюсь обнаружить близлежащие устройства Bluetooth с низким энергопотреблением в службе. Когда служба запускается, вызывается startLeScan(), а затем вызывается stopLeScan() через 10 секунд. Хотя startLeScan() возвращает true, и я не получил никакой ошибки, onLeScan для LeScanCallback не вызывался. Сервис:
.
.
.
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
Log.i(TAG, "New LE Device: " + device.getName() + " @ " + rssi);
if (DEVICE_NAME.equals(device.getName()) && deviceAddress.equals(device.getAddress())) {
mDevice = device;
BleScan(false);
connectBluetoothDevice();
}
}
};
/**
* Starts and stops Bluetooth LE scanning for BLE devices.
*
* @param enable true to start scanning, false to stop scanning.
*/
public void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mScanning) {
BleScan(false);
}
}
}, SCAN_PERIOD);
BleScan(true);
} else {
BleScan(false);
}
}
/**
* @param scan true to scan, and false to stop scanning for Bluetooth LE devices.
*/
private void BleScan(boolean scan) {
if (scan) {
mScanning = true;
boolean temp = mBluetoothAdapter.startLeScan(mLeScanCallback);
Log.i(TAG, "Started LE scan: " + temp);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
Я попытался использовать BluetoothLeScanner startScan () и stopScan (), и вместо этого использовал ScanCallback, но это не помогло:
ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
Log.i(TAG, "New LE Device: " + result.getDevice().getName() + " @ " + result.getRssi());
}
@Override
public void onScanFailed(int errorCode) {
Log.i(TAG, "Scan Faild!!");
}
};
/**
* Starts and stops Bluetooth LE scanning for BLE devices.
*
* @param enable true to start scanning, false to stop scanning.
*/
public void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mScanning) {
BleScan(false);
}
}
}, SCAN_PERIOD);
BleScan(true);
} else {
BleScan(false);
}
}
/**
* @param scan true to scan, and false to stop scanning for Bluetooth LE devices.
*/
private void BleScan(boolean scan) {
if (scan) {
mScanning = true;
mBluetoothLeScanner.startScan(mScanCallback);
Log.i(TAG, "Started LE scan");
} else {
mScanning = false;
mBluetoothLeScanner.stopScan(mScanCallback);
}
}
некоторые говорят, что GPS должен быть включен, поэтому я включил GPS. Я попытался перезагрузить устройство Android. Другое приложение обнаружения BLE может видеть устройство BLE.
Почему не вызывается обратный вызов сканирования?
редактировать
Я запускаю это приложение на устройстве Nexus 5 под управлением Android 6.0.1 .
Я попытался добавить разрешение местоположения, но это не помогло:
( uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" )
1 ответ
У меня похожая проблема. Тот же код, один планшет не работает, а другой работает. У меня нет решения, но когда я перезагружаю свой планшет и переустанавливаю apk, он снова может нормально работать.
Я обнаружил, что это onLeScan из BluetoothAdapter.LeScanCallback не вызывается в Android Marshmallow, когда я открываю GPS, это работает...
Попробуйте включить доступ к данным о местоположении в настройках приложения (Настройки -> Приложения -> Ваше приложение -> Правила -> Данные о местоположении)
Следуйте документам Google:
1. Добавьте эту строку в Manifest
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- Required only if your app isn't using the Device Companion Manager. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2.Перед настройкой проверьте разрешение ACCESS_FINE_LOCATION
private void checkPermission() {
String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(permissions, REQUEST_ENABLE_LOCATION);
}
}
- Если все не работает, проверьте разрешение вашего приложения в Настройки> Управление приложениями> Ваше приложение> Разрешение. Разрешить доступ к местоположению. Готово.