Для Android Маяк библиотека - Бле маяки обнаружения не работает
Я пытаюсь обнаружить маяки с помощью Android Beacon Library В Android. Я создал сервис, который работает в фоновом режиме и обнаруживает маяки.
Проблема в том, что приложение не обнаруживает маяки, когда bluetooth выключен. Но если я включу bluetooth, он будет работать нормально. Есть и действительно странная вещь. Если я снова отключу bluetooth во время работы приложения, оно все равно продолжит обнаружение. Это означает, что обнаружение BLE работает, но только если я включаю bluetooth и выключите его снова.
Как я могу включить обнаружение BLE? Ниже приводится моя реализация. Я что-то упустил?
Класс обслуживания Маяка
public class BeaconDiscoverer extends Service implements BeaconConsumer {
private static final String TAG = BeaconDiscoverer.class.getSimpleName();
private static BeaconManager beaconManager;
private static Region region;
private BackgroundPowerSaver backgroundPowerSaver;
public BeaconDiscoverer() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
region = new Region("myRangingUniqueId", null, null, null);
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
configureBatterySaverMode();
beaconManager.bind(this);
}
@Override
public void onDestroy() {
beaconManager.unbind(this);
super.onDestroy();
}
private void configureBatterySaverMode() {
BeaconManager.setAndroidLScanningDisabled(true);
backgroundPowerSaver = new BackgroundPowerSaver(getApplicationContext());
// set the duration of the scan to be 5 seconds
beaconManager.setBackgroundScanPeriod(Utility.convertToMilliseconds(2));
// set the time between each scan to be 1 min (60 seconds)
beaconManager.setBackgroundBetweenScanPeriod(Utility.convertToMilliseconds(25));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "BeaconDiscoverer started up");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onBeaconServiceConnect() {
Log.d(TAG, "onBeaconServiceConnect");
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
Beacon firstBeacon = beacons.iterator().next();
Log.i(TAG, "Beacon detected: " + firstBeacon.getDistance() + " m. - " + firstBeacon.getBluetoothAddress());
}
}
});
startRanging();
}
public void stopRanging() {
try {
beaconManager.stopRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void startRanging() {
if (User.currentUser() == null)
return;
try {
beaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
Класс приложения
public class App extends Application {
private static final String TAG = App.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
startService(new Intent(this, BeaconDiscoverer.class));
}
}
2 ответа:
Простой ответ: Вы должны иметь Bluetooth включен для обнаружения маяков с библиотекой. Маяки используют Bluetooth LE для рекламы своего присутствия, и радио Bluetooth должно быть включено, чтобы слышать сигналы.
Я не могу объяснить, почему вы продолжаете обнаруживать маяки после отключения Bluetooth. Одна из возможностей заключается в том, что вы просто видите их из кэша памяти в течение короткого периода цикла сканирования библиотеки, прежде чем они исчезнут. Другая возможность заключается в том, что Android-устройство говорит Bluetooth выключается, когда вы его выключаете, но на самом деле он не выключен.
Типичный подход заключается в том, чтобы определить, отключен ли Bluetooth при запуске приложения, и предложить пользователю включить его. В справочном приложении есть пример кода, который делает это здесь .
private void registerBoradcastReceiver() { IntentFilter stateChangeFilter = new IntentFilter( BluetoothAdapter.ACTION_STATE_CHANGED); IntentFilter connectedFilter = new IntentFilter( BluetoothDevice.ACTION_ACL_CONNECTED); //IntentFilter connectedFilter = new IntentFilter(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); IntentFilter disConnectedFilter = new IntentFilter( BluetoothDevice.ACTION_ACL_DISCONNECTED); registerReceiver(stateChangeReceiver, stateChangeFilter); registerReceiver(stateChangeReceiver, connectedFilter); registerReceiver(stateChangeReceiver, disConnectedFilter); } private BroadcastReceiver stateChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_ACL_CONNECTED == action) { startService; } if (BluetoothDevice.ACTION_ACL_DISCONNECTED == action) { stopService; } if (BluetoothAdapter.ACTION_STATE_CHANGED == action) { } } };