2015-11-09 4 views
3

Возможно ли фоновое мониторирование Eddystone маяка с использованием библиотеки altbeacon на платформе Android? Как я могу это достичь?Фоновый мониторинг маяка Eddystone с использованием библиотеки altbeacon на платформе Android.

Ниже приведен код, по которому я могу обнаружить маяки с указанным UUID при запуске приложения, но я хочу достичь того же, когда приложение не работает.

public class MainActivity extends ActionBarActivity implements BeaconConsumer,MonitorNotifier 
{ 

private BeaconManager beaconManager; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 


@Override 
protected void onResume() { 
    super.onResume(); 
    beaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext()); 
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19")); 
    beaconManager.bind(this); 
} 

@Override 
public void onBeaconServiceConnect() { 

    Identifier myBeaconNamespaceId = Identifier.parse("0xe2bfcc3cc2370789caef"); 
    Region region = new Region("my-beacon-region", myBeaconNamespaceId, null, null); 
    beaconManager.setMonitorNotifier(this); 
    try { 
     beaconManager.startMonitoringBeaconsInRegion(region); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void didEnterRegion(Region region) { 

     Log.d("radbeacon", "Beacon detected with namespace id " + region.getId1() +" and instance id: " + region.getId2()); 
} 

@Override 
public void didExitRegion(Region region) { 

    Log.d("radbeacon", "Beacon out of region with namespace id " + region.getId1() +" and instance id: " + region.getId2()); 
} 

@Override 
public void didDetermineStateForRegion(int i, Region region) { 
     //Ignore 
} 


} 
+0

PS: Я использую точку RadBeacon. –

ответ

2

Да, можно обнаружить Eddystone маяки в фоновом режиме с Android Beacon Library. Вы делаете это в том же порядке, как и с AltBeacon или IBeacon. Подробности описаны в разделе Starting App in the Background образцов.

EDIT: Как и в версии 2.6 библиотеки, была добавлена ​​поддержка аппаратного ускоренного обнаружения кадров Eddystone, что означает, что на устройствах Android 5+ вы можете получить обнаружение фона в течение примерно 5 секунд.

Основная идея - создать для вашего приложения центральный класс андроида Application и создать объект RegionBootstrap в методе onCreate этого класса. Важно помнить, что вы должны зарегистрировать этот класс Application в своем манифесте. Пример кода, приведенный выше, показывает вам, как это сделать.

Таким образом, вы бы в конечном итоге с чем-то, как показано ниже:

public class MyApplication extends Application implements BootstrapNotifier { 
    private static final String TAG = "MyApplication"; 
    private RegionBootstrap regionBootstrap; 
    private BackgroundPowerSaver backgroundPowerSaver; 
    private BeaconManager mBeaconManager; 

    public void onCreate() { 
     super.onCreate(); 
     mBeaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this); 
     mBeaconManager.getBeaconParsers().clear(); 
     mBeaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); 
     Identifier myBeaconNamespaceId = Identifier.parse("0xe2bfcc3cc2370789caef"); 
     Region region = new Region("my-beacon-region", myBeaconNamespaceId, null, null); 

     regionBootstrap = new RegionBootstrap(this, region); 

     backgroundPowerSaver = new BackgroundPowerSaver(this); 
    } 

    @Override 
    public void didEnterRegion(Region region) { 

      Log.d("radbeacon", "Beacon detected with namespace id " + region.getId1() +" and instance id: " + region.getId2()); 
    } 

    @Override 
    public void didExitRegion(Region region) { 

     Log.d("radbeacon", "Beacon out of region with namespace id " + region.getId1() +" and instance id: " + region.getId2()); 
    } 

    @Override 
    public void didDetermineStateForRegion(int i, Region region) { 
      //Ignore 
    } 
... 
} 
+1

Спасибо за ответ david :) Я использовал этот код в соответствии с инструкциями, но не уверен, способен ли он отслеживать маяк в фоновом режиме, но когда я запустил приложение, он немедленно обнаружит маяк. Что тут происходит? Как часто приложение отслеживает маяк в фоновом режиме? –

+0

По умолчанию на Android 4.x он сканирует маяки каждые 5 минут. На Android 5+ он постоянно сканирует фоновый режим. – davidgyoung

+1

Я запускаю его без Android 5.0.2, но, используя приведенный выше код, он никогда не обнаруживает маяк в фоновом режиме ... маяк обнаруживается только при запуске приложения. Требуется ли root-доступ или я что-то упускаю? –

0

Еще одна очень важная вещь, чтобы рассмотреть это добавление имя класса Application в AndroidManifest.xml, просто добавьте android:name=".yourApplication" к <application> тега.

Есть ли доступный пример для мониторинга и ранжирования в классе приложений?

+0

проверьте эту ссылку -> https://altbeac.g.gub.io/android-beacon-library/samples.html для примера ранжирования. –

+0

Нет образца для мониторинга и ранжирования, но это легко сделать. Просто сделайте класс 'Application' для реализации' RangeNotifier'. Затем в методе 'didEnterRegion' установите 'rangeNotifier = self;' и вызовите 'beaconManager.startRangingBeaconsInRegion (область) '. Если у вас возникли проблемы, отправьте новый вопрос, и я отвечу. – davidgyoung

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