2016-06-27 2 views
0

Библиотека продолжает сканирование правильно, но не обнаруживает маяк в этом режиме.AltBeacon не обнаруживает маяк, когда приложение закрыто

Я читал во многих местах, но между ними есть разные мнения, независимо от того, возможно это или нет. (я хочу думать, что это)

В IOS, это же реализация с использованием нативного SDK может быть реализована без каких-либо неудобств, это кажется немного сложнее в андроиде.

Работает идеально, когда является передним и задним планом.

Это моя beaconManager конфигурация:

public void setUpBeaconManager() throws RemoteException { 
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
    beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(MainActivity.this); 
    beaconManager.getBeaconParsers().clear(); 
    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")); 
    beaconManager.setBackgroundBetweenScanPeriod(2000); 
    beaconManager.setForegroundBetweenScanPeriod(2000); 
    beaconManager.updateScanPeriods(); 
    beaconManager.bind(MainActivity.this); 
    } 
} 

@Override 
public void onBeaconServiceConnect() { 
    Log.e(Tags.MAIN_ACTIVITY, "Beacon "+beaconManager.checkAvailability()); 
    beaconManager.setRangeNotifier(new RangeNotifier() { 

    @Override 
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
     if (beacons.size() > 0) { 
     Beacon firstBeacon = beacons.iterator().next(); 
     if (finishedRequest) { 
      Log.e("", "beacon id1: " + firstBeacon.getId1()); 
      processDetectBeacons(firstBeacon.getId2().toInt(), firstBeacon.getId3().toInt()); 
     } 
     Log.e(Tags.MAIN_ACTIVITY, "Beacon " + firstBeacon.toString() + " is about " + firstBeacon.getDistance() + " meters away."); 
     } 
    } 
    }); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {beaconManager.unbind(this);} 
} 

Inclusive я пытаюсь реализовать BootstrapNotifier

public class ApplicationManager extends Application implements BootstrapNotifier 

public void onCreate() { 
    super.onCreate(); 
    initRegionBootstrap(); 
} 

private void initRegionBootstrap() { 
    Log.d("RegionBootstrap", "Init RegionBootstrap functionality!!!"); 
    Region region = new Region("xxxx-4xx2-4E98-xxx-Bx5B7xxxx893E", Identifier.parse("xxxx-4xx2-4E98-xxx-Bx5B7xxxx893E"), null, null); 
    regionBootstrap = new RegionBootstrap(this, region); 
} 

@Override 
public void didEnterRegion(Region region) { 
    Log.d("", "didEnterRegion: " + region); 
} 


@Override 
public void didExitRegion(Region region) { 
    Log.d("", "didExitRegion"); 
} 


@Override 
public void didDetermineStateForRegion(int i, Region region) { 
    Log.d("", "didDetermineStateForRegion"); 
} 

Спасибо за чтение, я надеюсь, что вы можете помочь.

+0

Вам обязательно нужно использовать BootstrapNotifier. Можете ли вы показать метод onCreate() ApplicationManager? – davidgyoung

+0

@ davidgyoung добавлено 'onCreate()' method – jose920405

ответ

2

Основываясь на приведенном коде, ApplicationManager 's didEnterRegion(Region region) следует вызывать каждый раз, когда система обнаруживает, что маяк отображается в диапазоне.

Несколько советов:

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

  • Признать, что сканирование происходит медленнее в фоновом режиме на 4.x. Поведение по умолчанию на Android 4.x - это сканирование каждые 5 минут. Это означает, что это может занять много времени для обнаружения фона. На основе кода, показанного для MainActivity, если это выполняется, он увеличит фоновый период между сканированием до двух секунд. Однако, если приложение будет убито, этот код не будет выполняться при перезагрузке приложения (поскольку это действие), и сканирование будет выполняться каждые 5 минут. Убедитесь, что вы достаточно долго ждали.

  • При сканировании малой мощности 5.x используются в фоновом режиме. Реализация сканирования с малой мощностью зависит от устройства. На новых устройствах, таких как Nexus 5 и 5x, будут выполняться постоянные проверки и отправлять результаты в приложение в течение 3-6 секунд. На устройствах Samsung Galaxy S5 периодическое сканирование будет выполняться каждые 15 минут. Таким образом, для обнаружения фона может потребоваться до 15 минут. Убедитесь, что вы достаточно долго ждали.

  • После того как вы убьете приложение, библиотека попытается перезапустить службу сканирования в течение 5 минут, но это может занять много времени. Убедитесь, что вы достаточно долго ждали.

  • Существуют различные способы убить приложение, а некоторые способы его уничтожения не позволят процессу сканирования перезапустить себя. Если вы убьете приложение из «Настройки» -> «Приложения» - «Мое приложение» - «Силовая остановка», ОС не позволит перезапустить Android Beacon Library.Было несколько сообщений о том, что убийство приложения из переключателя задач вызывает такое же поведение на некоторых устройствах, но телефоны с такими сборками встречаются редко. Используйте adb logcat или adb shell ps в командной строке, чтобы проверить, работает ли приложение через пять минут после его увольнения.

Лучший подход может быть попробовать использовать Reference App для библиотеки и посмотреть, если он обнаруживает маяки в фоновом режиме после убийства приложения. Это устранит любую возможную проблему с кодированием, оставив в качестве возможных виновников только методологию тестирования и специфические для устройства проблемы.

+0

Любые комментарии к тому, что заставило его работать на вас, могут быть полезны для других. – davidgyoung

+0

Есть ли способы обхода проблемы «до 15 минут»? Это время слишком долго для нашего случая использования. – NickG

+0

Да. В качестве резервной копии Android Beacon Library периодически выполняет сканирование с малой задержкой, даже в фоновом режиме. По умолчанию это составляет 10 секунд каждые 5 минут, поэтому вы должны видеть обнаружение по крайней мере каждые пять минут, не каждые 15 минут, даже на устройствах Samsung. Если это еще не достаточно быстро, вы можете настроить этот интервал фонового сканирования на 'beaconManager.setBackgroundBetweenScanPeriod (xxx)' и 'beaconManager.setBackgroundScanPeriod (xxx)' Просто будьте осторожны, когда вы это сделаете, потому что чем больше времени вы тратите на сканирование, тем больше батареи, которую вы будете использовать. – davidgyoung

Смежные вопросы