0

我在Android的燈塔庫 - 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

如果您在應用程序啓動時已位於該區域內,則不會收到輸入事件。這是設計。

編輯:圖書館2.9有兩個修改,使其確定在啓動時更容易地區狀態:

  1. 其中一個應用程序啓動監控,didDetermineStateForRegion回調保證被調用,告訴你的狀態該區域。 (該didEnterRegiondidExitRegion回調可能不會觸發,除非確實有變化。)

  2. 如果要禁用區域狀態持續性,你可以這樣做與beaconManager.setRegionStatePeristenceEnabled(false);這將保證一個回調didEnterRegion第一次信標在應用程序啓動後看到,即使應用程序重新啓動之前幾秒鐘前可以看到信標。

請不要按照下面如果你是2.9+的指示,因爲該解決方案已被棄用,並且可能不會在今後的工作。

如果你想在第一次檢測爲每個應用程序啓動時額外的條目事件,你可以添加這行代碼: MonitoringStatus.getInstanceForApplication(本).stopStatusPreservationOnProcessDestruction();

我們正在努力使此行爲在下一版本中更容易配置。

+0

我意識到這一點,並回到這裏回答自己:沒有地區變化=沒有回電。 – Roven

+0

我的問題現在變成了「在啓動時如何讀取區域狀態(內部/外部)?」我會尋找答案。感謝您的回覆 – Roven

+0

請參閱適用於Android Beacon庫的新版本的更新回答,以解決此問題。 – davidgyoung

相關問題