0

Я пишу простое приложение радиомаяка в AndroidBeacon библиотека - bootstrapNotifier: нет обратного вызова, если уже в области

При запуске вне области он работает (вот мой пользовательский журнал):

onCreate - In 
onCreate - Out 
onBeaconServiceConnect - In 
onBeaconServiceConnect - Out 
didDetermineStateForRegion (INSIDE) 
didEnterRegion - In 
dER - startRangingBeaconsInRegion OK 
didEnterRegion - Out 
didRangeBeaconsInRegion - 1 beacons 
...... omitted ..... 
didRangeBeaconsInRegion - 0 beacons 
didDetermineStateForRegion (OUTSIDE) 
didExitRegion - In 
dXR - stopRangingBeaconsInRegion OK 
didExitRegion - Out 
didRangeBeaconsInRegion - 0 beacons 

Если начато внутри региона, методы bootstrapNotifier (т.е. monitorNotifier) не называются

Может ли кто-нибудь увидеть, где я здесь не так?

package it.test.test01; 

import android.app.Application; 
import android.os.RemoteException; 
import android.util.Log; 

import org.altbeacon.beacon.Beacon; 
import org.altbeacon.beacon.BeaconConsumer; 
import org.altbeacon.beacon.BeaconManager; 
import org.altbeacon.beacon.BeaconParser; 
import org.altbeacon.beacon.MonitorNotifier; 
import org.altbeacon.beacon.RangeNotifier; 
import org.altbeacon.beacon.Region; 
import org.altbeacon.beacon.powersave.BackgroundPowerSaver; 
import org.altbeacon.beacon.startup.RegionBootstrap; 
import org.altbeacon.beacon.startup.BootstrapNotifier; 

import java.util.Collection; 


public class testApplication extends Application 
    implements BootstrapNotifier, BeaconConsumer, RangeNotifier { 
    private final String TAG = "Application "; 
    protected static final Region beaconRegion = new Region("test01", null, null, null); 
    protected BeaconManager beaconManager = null; 
    private RegionBootstrap regionBootstrap; 
    private BackgroundPowerSaver backgroundPowerSaver; 

    protected static String sLog = ""; 

    @Override 
    public void onCreate() { 
    super.onCreate(); 
    logIt(TAG, "onCreate - In"); 
    beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(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"));//iBeacon (tutti) 
    //--- wake up the app when a beacon is seen 
    regionBootstrap = new RegionBootstrap(this, beaconRegion); 
    //--- activate power saver 
    backgroundPowerSaver = new BackgroundPowerSaver(this); 
    beaconManager.bind(this); 
    logIt(TAG, "onCreate - Out"); 
    } 

    private void logIt (String TAG, String msg) { 
    sLog += TAG + msg + "\n"; 
    Log.w(TAG, msg); 
    } 

    //-------------------------// 
    //--- BootstrapNotifier ---// 
    //-------------------------// 
    @Override 
    public void didDetermineStateForRegion(int state, Region region) { 
    String msg = "didDetermineStateForRegion "; 
    switch(state) { 
    case MonitorNotifier.INSIDE: 
     msg +="(INSIDE)"; 
     break; 
    case MonitorNotifier.OUTSIDE: 
     msg +="(OUTSIDE)"; 
     break; 
    default: 
     msg +="(state=" +state +")"; 
     break; 
    } 
    logIt(TAG, msg); 
    } 

    @Override 
    public void didEnterRegion(Region arg0) { 
    logIt(TAG, "didEnterRegion - In"); 
    try { 
     beaconManager.startRangingBeaconsInRegion(beaconRegion); 
     logIt(TAG,"dER - startRangingBeaconsInRegion OK"); 
    } catch (RemoteException e) { 
     logIt(TAG, "dER - startRangingBeaconsInRegion Err " +e); 
    } 
    logIt(TAG, "didEnterRegion - Out"); 
    } 

    @Override 
    public void didExitRegion(Region region) { 
    logIt(TAG, "didExitRegion - In"); 
    try { 
     beaconManager.stopRangingBeaconsInRegion(beaconRegion); 
     logIt(TAG,"dXR - stopRangingBeaconsInRegion OK"); 
    } catch (RemoteException e) { 
     logIt(TAG, "dXR - stopRangingBeaconsInRegion Err " +e); 
    } 
    logIt(TAG, "didExitRegion - Out"); 
    } 

    //----------------------// 
    //--- BeaconConsumer ---// 
    //----------------------// 
    @Override 
    public void onBeaconServiceConnect() { 
    logIt(TAG, "onBeaconServiceConnect - In"); 
    beaconManager.setRangeNotifier(this); 
    logIt(TAG, "onBeaconServiceConnect - Out"); 
    } 

    //---------------------// 
    //--- RangeNotifier ---// 
    //---------------------// 

    @Override 
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
    logIt(TAG, "didRangeBeaconsInRegion - " +beacons.size() +" beacons"); 
    } 
} 

ответ

0

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

EDIT: Библиотека 2,9 имеет две модификации, чтобы сделать определения состояния региона при запуске проще:

  1. Одно приложение начинает мониторинг, то didDetermineStateForRegion обратного вызова гарантированно можно назвать, говоря вам состояние область. (В didEnterRegion и didExitRegion обратных вызовов могут не срабатывать, если не будут на самом деле изменения.)

  2. Если вы хотите отключить область сохранения состояния, вы можете сделать это с beaconManager.setRegionStatePeristenceEnabled(false); Это будет гарантировать обратный вызов didEnterRegion в первый раз, маяк после запуска приложения, даже если маяк был замечен за пару секунд до перезапуска приложения.

Пожалуйста, не следуйте инструкциям ниже, если вы находитесь на 2.9+, поскольку решение является устаревшим, и не может работать в будущем.

Если вы хотите дополнительное событие входа на первом обнаружении для каждого запуска приложения, вы можете добавить следующую строку кода: MonitoringStatus.getInstanceForApplication (это) .stopStatusPreservationOnProcessDestruction();

Мы работаем над тем, чтобы это поведение было проще настроить в следующей версии.

+0

Я понял это и вернулся сюда, чтобы ответить самому себе: ни одна область не изменилась = нет перезвона. – Roven

+0

Теперь мой вопрос изменится на «как я могу узнать статус региона (внутри/снаружи) при запуске?» и я буду искать ответ. Спасибо за ответ – Roven

+0

Пожалуйста, см. Мой обновленный ответ, который относится к новой версии Android Beacon Library для решения этой проблемы. – davidgyoung