Я строю приложение, использующее библиотеку AltBeacon для поддержки Onyx Beacons (Beacon One) и Gimbal Beacons (Series 21)AltBeacon неустойчиво OnyxBeacons, езда на велосипеде через didEnterRegion и didExitRegion неоднократно
Мой тестовое устройство является Nexus 7 2013 с Android 4.4. 4 KitKat и маяк Оникс. Маяк просто сидит на расстоянии менее метра рядом с моим устройством, и я не двигаю его. Маяк обнаружен и переходит в didEnterRegion
, а затем через минуту или около того он переходит в didExitRegion
, тогда цикл повторяется.
Мы также протестировали это на другом устройстве (Samsung Phone) с использованием другого (Onyx) маяка. Тем не менее проблема возникает. Обратите внимание, что это происходит только на Onyx Beacons (Beacon One). Gimbal Beacons (Series 21) запускаются только один раз в диапазоне.
Я использую правильные строки анализатора маяка? Правильно ли я это реализую? У меня действительно нет идей, и я хотел поддержать оба маяка.
BaseApplication
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
startService(new Intent(this, BeaconMonitoringService.class));
}
}
BeaconMonitoringService
public class BeaconMonitoringService extends Service implements BeaconConsumer{
private Context context;
private BeaconService service;
private BeaconManager beaconManager;
private NotificationCompat.Builder notifBuilder;
@Override
public void onCreate(){
super.onCreate();
context = getBaseContext();
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.setBackgroundMode(true);
beaconManager.setBackgroundScanPeriod(1100l);
beaconManager.setBackgroundBetweenScanPeriod(15000l);
String[] beaconParsers = new String[] { "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24", "m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25", "m:2-3=0203,i:14-19l,d:10-13,p:9-9" };
for(String beacon : beaconParsers){
Log.i("BeaconService","layout: "+beacon);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(beacon));
}
beaconManager.bind(this);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.setMonitorNotifier(new MonitorNotifier() {
private String log;
@Override
public void didEnterRegion(Region region) {
Beacon beacon = service.getBeacon(region.getId1().toString(), region.getId2().toString(), region.getId3().toString());
log = "I just saw a beacon for the first time! "+region.getId1()+" "+region.getId2()+" "+region.getId3();
Log.i("BeaconService", log);
sendNotification(beacon);
}
@Override
public void didExitRegion(Region region) {
Beacon beacon = service.getBeacon(region.getId1().toString(), region.getId2().toString(), region.getId3().toString());
log = "I no longer see a beacon";
Log.i("BeaconService", log);
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
}
});
List<BackendRegion> regionList = Util.getRegionList();
for(BackendRegion region : regionList){
ArrayList<Beacon> beaconList = region.getBeacons();
for(Beacon beacon : beaconList){
try {
String beaconString = region.getUuid().toLowerCase() + " " + beacon.getMajor() + " " + beacon.getMinor();
service.addBeacon(beacon);
beaconManager.startMonitoringBeaconsInRegion(new Region(beacon.getIdentifier(), Identifier.parse(region.getUuid()),Identifier.parse(beacon.getMajor()),Identifier.parse(beacon.getMinor())));
} catch (RemoteException e) { }
}
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy(){
beaconManager.unbind(this);
super.onDestroy();
}
private void sendNotification(Beacon beacon, InteractiveImage interactiveImage) {
this.notifBuilder = new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentTitle("Sample Beacon")
.setContentText("A beacon was detected")
.setSmallIcon(R.drawable.ic_launcher);
Intent notifyIntent = new Intent(this, NotificationActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notifyIntent, 0);
notifBuilder.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(Integer.parseInt(beacon.getId()), notifBuilder.build());
}
}
Вход
12-11 15:45:24.103 I/BeaconService: I just saw a beacon for the first time! 20cae8a0-a9cf-11e3-a5e2-0800200c9a66 7 44512
12-11 15:45:24.784 D/BluetoothAdapter: stopLeScan()
12-11 15:45:39.698 D/BluetoothAdapter: startLeScan(): null
12-11 15:45:39.709 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:45:40.830 D/BluetoothAdapter: stopLeScan()
12-11 15:45:55.794 D/BluetoothAdapter: startLeScan(): null
12-11 15:45:55.804 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:45:56.985 D/BluetoothAdapter: stopLeScan()
12-11 15:46:11.920 D/BluetoothAdapter: startLeScan(): null
12-11 15:46:11.950 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:46:13.091 D/BluetoothAdapter: stopLeScan()
12-11 15:46:27.996 D/BluetoothAdapter: startLeScan(): null
12-11 15:46:28.016 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:46:29.147 D/BluetoothAdapter: stopLeScan()
12-11 15:46:29.227 I/BeaconService: I no longer see a beacon
12-11 15:46:44.121 D/BluetoothAdapter: startLeScan(): null
12-11 15:46:44.141 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:46:44.402 I/BeaconService: I just saw a beacon for the first time! 20cae8a0-a9cf-11e3-a5e2-0800200c9a66 7 44512
12-11 15:46:45.282 D/BluetoothAdapter: stopLeScan()
12-11 15:47:00.197 D/BluetoothAdapter: startLeScan(): null
12-11 15:47:00.197 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:47:01.328 D/BluetoothAdapter: stopLeScan()
12-11 15:47:16.343 D/BluetoothAdapter: startLeScan(): null
12-11 15:47:16.363 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:47:17.514 D/BluetoothAdapter: stopLeScan()
12-11 15:47:32.418 D/BluetoothAdapter: startLeScan(): null
12-11 15:47:32.428 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:47:33.540 D/BluetoothAdapter: stopLeScan()
12-11 15:47:48.494 D/BluetoothAdapter: startLeScan(): null
12-11 15:47:48.504 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:47:49.635 D/BluetoothAdapter: stopLeScan()
12-11 15:48:04.620 D/BluetoothAdapter: startLeScan(): null
12-11 15:48:04.630 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:48:05.771 D/BluetoothAdapter: stopLeScan()
12-11 15:48:20.706 D/BluetoothAdapter: startLeScan(): null
12-11 15:48:20.706 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:48:21.827 D/BluetoothAdapter: stopLeScan()
12-11 15:48:36.821 D/BluetoothAdapter: startLeScan(): null
12-11 15:48:36.831 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:48:37.962 D/BluetoothAdapter: stopLeScan()
12-11 15:48:52.917 D/BluetoothAdapter: startLeScan(): null
12-11 15:48:52.927 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:48:54.058 D/BluetoothAdapter: stopLeScan()
12-11 15:49:09.003 D/BluetoothAdapter: startLeScan(): null
12-11 15:49:09.003 D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
12-11 15:49:10.154 D/BluetoothAdapter: stopLeScan()
12-11 15:49:10.214 I/BeaconService: I no longer see a beacon
Должен ли я изменить 'setBackgroundScanPeriod' также? – bman
Период фонового сканирования по умолчанию уже длиннее, но вы можете увеличить его до 60000l, чтобы быть уверенным, что вы обнаружите маяк. – davidgyoung
Насколько я хочу принять это в качестве ответа, я попытался замедлить скорость сканирования, но проблема все еще сохраняется. – bman