0

ich in Android eine einfache Leuchtfeuer Anwendung schreibenBeacon Bibliothek - bootstrapNotifier: kein Rückruf, wenn bereits in einem Bereich

Wenn außerhalb einer Region begann es funktioniert (hier ist mein benutzerdefiniertes Protokoll):

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 

Wenn innerhalb einer Region gestartet, werden die bootstrapNotifier (dh monitorNotifier) Methoden nicht

Kann jemand sehen, wo ich hier falsch liege?

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"); 
    } 
} 

Antwort

0

Wenn Sie bereits in der Region sind, wenn die App gestartet wird, erhalten Sie kein Eintrittsereignis. Das ist Absicht.

EDIT: Bibliothek 2.9 hat zwei Modifikationen der Region Zustand beim Start zu machen Bestimmung einfacher:

  1. One die App startet die Überwachung, die didDetermineStateForRegion Rückruf aufgerufen werden, ist garantiert, können Sie den Zustand zu sagen, die Region. (Die didEnterRegion und didExitRegion Rückrufe Feuer kann nicht, wenn es tatsächlich eine Veränderung.)

  2. Wenn Sie Region Zustand Persistenz deaktivieren möchten, können Sie dies mit beaconManager.setRegionStatePeristenceEnabled(false); Dieser einen Rückruf didEnterRegion das erste Mal garantiert ein Leuchtfeuer ist nach dem Start der App angezeigt, auch wenn das Beacon einige Sekunden vor dem Neustart der App sichtbar war.

Bitte nicht folgen Sie den Anweisungen unten, wenn Sie sind auf 2.9+, weil die Lösung veraltet ist und nicht in der Zukunft arbeiten.

Wenn Sie einen zusätzlichen Eintrag Ereignis für jede App Start auf erste Erkennung tun möchten, können Sie diese Codezeile hinzu: MonitoringStatus.getInstanceForApplication (this) .stopStatusPreservationOnProcessDestruction();

Wir arbeiten daran, dieses Verhalten in der nächsten Version einfacher zu konfigurieren.

+0

Ich erkannte es und war zurück hier, um mich zu beantworten: keine Änderung der Region = kein Rückruf. – Roven

+0

Meine Frage ändert sich nun zu "Wie kann ich den Status der Region (innerhalb/außerhalb) beim Start lesen?" und ich werde nach der Antwort suchen. Danke für die Antwort – Roven

+0

Bitte beachten Sie meine aktualisierte Antwort, die für eine neue Version der Android Beacon Library gilt, um dieses Problem zu beheben. – davidgyoung