2014-09-10 31 views
5

可見標我使用這個頁面(http://altbeacon.github.io/android-beacon-library/samples.html)在啓動一個應用程序在背景部分的示例代碼和我有一個工作程序。如何獲得從RegionBootstrap AltBeacon方法

它會檢測到信標在範圍內,即使在背景上。

的問題是我需要知道哪個信標是它(UUID,主要,次要),以便然後匹配它我的本地數據庫,並拋出一個通知,應用程序仍然在後臺。

的didEnterRegion(地區區域)的功能只有一個matchesBeacon方法,我試着做以下,以確定該信標被看到,但它拋出一個NullPointerException:

public class SightSeeing extends Activity implements BootstrapNotifier, RangeNotifier { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Region region = new Region("sightRegion", null, null, null); 
    regionBootstrap = new RegionBootstrap(this, region); 

    BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(
      new BeaconParser(). setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24") 
    ); 

    BeaconManager.getInstanceForApplication(this).setRangeNotifier(this); 

} 

@Override 
public void didEnterRegion(Region region) { 

    regionBootstrap.disable(); 

    BeaconManager.getInstanceForApplication(this).setRangeNotifier(this); 

    try { 
     BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(region); 
    } 
    catch (RemoteException e) { 
     Log.e(TAG, "Can't start ranging"); 
    } 

} 


@Override 
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
    if (beacons.size() > 0) { 
     Iterator<Beacon> beaconIterator = beacons.iterator(); 
     while (beaconIterator.hasNext()) { 
      Beacon beacon = beaconIterator.next(); 
      //check if beacon exists in our DB and throw notification 
     } 
    } 
} 

我錯過這個庫很明顯或者不可能這麼做?

編輯:

我已經更新了代碼示例給你們一個更廣闊的想法,我已經試過落實FOliveira的建議沒有任何成功。

EDIT2:

更新代碼,以反映davidgyoung的建議。仍然沒有運氣。我在didRangeBeaconsInRegion()函數的第一行有一個Log.d(),並且它沒有被調用。

我已經嘗試添加BeaconManager.getInstanceForApplication(本).setRangeNotifier(本);在try/catch塊之前,結果是一樣的。

我是否實施了錯誤的建議或是否有任何其他方式使其發揮作用?

+0

你知道didEnterRegion被調用嗎?嘗試在頂部添加一條調試線。很明顯,如果它沒有被調用,你將無法成功開始測量這個設置。 – davidgyoung 2014-09-11 06:21:36

+0

你解決了這個問題嗎?我面臨同樣的問題。 – 2015-11-02 04:08:52

回答

0

您可以實現RangeNotifier接口,並且您可以訪問該接口的public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region)方法中捕獲的所有信標信息。希望我得到了正題吧

+0

我在主類中實現了RangeNotifier,但它並未被RegionBootstrap在後臺調用。 – 2014-09-10 15:34:52

+0

我已更新我的回答以反映您的建議,因爲它無效。讓我知道你的意思是不同的事情,因爲它還沒有工作。 – 2014-09-10 15:39:26

+0

噢好吧,我現在明白你的問題了!我認爲你實際上不能從「RegionBootstrap」中獲取信息,而是可以嘗試創建與你的特定信標匹配的區域。Region Region = new Region(「NameOfTheBeacon」,「UUID」,「Major」,「Minor」 );'這隻會觸發你的特定區域(你可以根據我的理解定義幾個區域)。這只是一個提示,因爲在我的應用程序中,我有一個服務在後臺運行,實現'RangeNotifier',我檢查所有可用的信標。 – FOliveira 2014-09-10 15:41:32

4

如果你想在應用啓動本身的信標檢測,那麼RegionBootstrap是要走的最簡單的方法。爲了這個與測距需要檢測單個信標結合,然後在didEnterRegion方法中添加如下代碼:

try { 
    BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(region); 
} 
catch (RemoteException e) { 
    Log.e(TAG, "Can't start ranging"); 
} 

然後實現測距回調喜歡你。

您還需要以下刪除代碼,這可能是什麼原因造成您的NullPointerException,因爲:

for(int i=0; i< beaconsList.size(); i++) { 
    Beacon b = new Beacon.Builder() 
      .setId1(beaconsList.get(i).get("uuid")) 
      .setId2(beaconsList.get(i).get("major")) 
      .setId3(beaconsList.get(i).get("minor")) 
      .build(); 

    if(region.matchesBeacon(b)) { 
     //get info from DB and throw notification 
    } 
} 

編輯:我已經更新了圖書館的參考應用展示瞭如何可以做到這一點成功。請看這裏:https://github.com/AltBeacon/android-beacon-library-reference/blob/master/src/org/altbeacon/beaconreference/BeaconReferenceApplication.java

+0

我試過實現你的建議,現在反映在原始問題中。我的didRangeBeaconsInRegion()永遠不會被調用。 我做錯了什麼,或者我錯過了什麼? – 2014-09-10 16:41:16

+0

我沒有看到你的代碼有任何問題,並且我已經驗證了這在我們的參考應用中有效。我將在明天發佈我們的參考應用程序的更新副本,並添加一個鏈接到它的評論供您嘗試。 – davidgyoung 2014-09-11 06:19:32

+0

我已經得到它正常工作:)感謝您的支持 – 2014-09-11 19:10:35