![](/img/trans.png)
[英]Cannot detect iBeacon using AltBeacon/android-beacon-library
[英]How to detect Region Enter/Exit for multiple beacons using AltBeacon android-beacon-library?
我正在使用iBeacons並使用AltBeacon庫。
beaconManager.getBeaconParsers()
.add(new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
我想我的Android應用程序在信標進入和退出可見性時檢測並生成事件。 使用方法使用庫的單個信標可以很好地工作。
public void **didEnterRegion**(Region region)
和
public void **didExitRegion**(Region region)
我的問題是同時可以看到多個信標。 我試圖維護一個所有信標可見的數組。 我想在每次信標進入和退出時生成一個事件。 事件應通過其唯一標識符識別生成事件的信標。 我的信標可以使用beacon.getIdentifiers()
或(UUID,Major和Minor)進行唯一標識
問題是,在所有信標退出該區域之前, didExitRegion
方法不會執行。
誰能想到一個簡單的方法讓我使用AltBeacon庫實現我的目標?
任何建議將不勝感激。
兩種選擇:
設置一個不同的區域,僅匹配每個單獨的信標,指定所有標識符,並監視每個信標。 您將獲得每個區域的不同進入和退出回調。
Region region1 = new Region("myIdentifier1", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1")); Region region2 = new Region("myIdentifier2", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2")); beaconManager.startMonitoringBeaconsInRegion(region1); beaconManager.startMonitoringBeaconsInRegion(region2);
啟用測距,並將代碼放入didRangeBeaconsInRegion
回調中以跟蹤各個信標。 您可以使用java.util.HashMap
跟蹤所有可見的信標(每個信號都顯示最新時間的時間戳),然后如果您還沒有看到信標,比如五秒鍾,您可以從HashMap
刪除信標並執行該信標的退出邏輯。
選項1適用於少量信標,您可以事先知道它們的標識符。 選項2涉及更多,但對於大量信標或者如果您事先不知道其標識符則更好。
/ ***************此守則用於估計信標***************** /
private final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("beaconall", null, null, null);
private BeaconManager beaconManager;
public onCreate()
{
beaconManager.connect(new BeaconManager.ServiceReadyCallback()
{
@Override
public void onServiceReady()
{
Log.d("Lalit", "Beacon service Ready");
beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION);
beaconManager.startMonitoring(ALL_ESTIMOTE_BEACONS_REGION);
}
});
beaconManager.setRangingListener(new BeaconManager.RangingListener() {
@Override
public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {
int index = beacons.size();
// UUID uuid = UUID.fromString("");
if (beacons.size() > 0) {
Beacon SelectedBeacon = beacons.get(index-1);
Log.d("Lalit", "Beacon Id :- " + SelectedBeacon.getProximityUUID());
Log.d("Lalit", "Beacon major :- " + SelectedBeacon.getMajor());
Log.d("Lalit", "Beacon miner :- " + SelectedBeacon.getMinor());
Log.d("Lalit", "Beacon total :- " + beacons.size());
Log.d("Lalit","Distance :- "+ getDistance(SelectedBeacon.getRssi(),SelectedBeacon.getMeasuredPower()));
}
}
});
beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
@Override
public void onEnteredRegion(Region region, List<Beacon> list) {
Calendar calendar = Calendar.getInstance();
Date entertime = calendar.getTime();
Log.d("Lalit", "Region Enter :- " + entertime);
Log.d("List", "Region UUID id :- " + region.getProximityUUID());
}
@Override
public void onExitedRegion(Region region) {
Calendar calendar = Calendar.getInstance();
Date entertime = calendar.getTime();
Log.d("Lalit", "Region exit :- " + entertime);
Log.d("List", "Region UUID id :- " + region.getProximityUUID());
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.