离开信标区域时触发 didEnterRegion 事件
didEnterRegion event fired when out of beacon area
当你在信标区域外时,有时会进入didEnterRegion。
有时在信标区不进入didEnterRegion。
这会持续很长时间。
终端是富士通箭矢M03。 Android™ 6.0
在didEnterRegion中可以通过didRangeBeaconsInRegion获取beacon信息
activity 被前台服务使用。
BeaconManager 在该服务中用作前台。
屏幕关闭。但是在服务中获取了wakeLock。
信标扫描间隔为4秒。 setForegroundBetweenScanPeriod (4000);
监控以 10 秒为间隔关闭/打开。
永远不要输入 didExitRegion。
我觉得需要开启监控10秒以上才能进入
didExitRegion是不是一定要生成?
最好不要每隔10秒打开/关闭监控? ON 总是更好吗?
信标检测设置
g_beaconManager = BeaconManager.getInstanceForApplication(this);
g_beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
g_beaconManager.bind(this);
g_beaconManager.setForegroundBetweenScanPeriod(4000);
g_region = new Region("iBeacon", null, null, null);
BeaconManager 服务
@Override
public void onBeaconServiceConnect() {
g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
public void didEnterRegion(Region region) {
Log.d("Beacon", "didEnterRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didExitRegion(Region region) {
Log.d("Beacon", "didExitRegion Success!!");
if (g_beaconManager.getRangedRegions().size() != 0) {
try {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
Log.d("Beacon", "didDetermineStateForRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
try {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
g_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) {
Beacon lBeacon_Most_Near_Distance = null;
Log.d("Beacon" , "addRangeNotifier Success!!");
for (Beacon beacon : Beacons) {
if (lBeacon_Most_Near_Distance == null)
{
lBeacon_Most_Near_Distance = beacon;
}
else
{
if (lBeacon_Most_Near_Distance.getDistance() > beacon.getDistance())
{
lBeacon_Most_Near_Distance = beacon;
}
}
}
}
});
}
每10秒监控一次OFF/ON
try {
if (g_beaconManager.getRangedRegions().size() != 0) {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
}
if (g_beaconManager.getMonitoredRegions().size() != 0) {
g_beaconManager.stopMonitoringBeaconsInRegion(g_region);
} else {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
}
} catch (RemoteException e) {
e.printStackTrace();
}
库在 10 秒内没有看到任何可见的信标数据包,确定它已退出一个区域。可以通过调用 BeaconManager.setRegionExitPeriod(15000); // change to 15 seconds
将此常量覆盖为您想要的任何值。如果您不让监视 运行 这么长时间,您将不会获得任何区域退出事件。
该库专为您设计,可以打开监视并长时间保持打开状态。在这么短的时间后将其关闭是自找麻烦,不仅仅是退出区域,而且会频繁启动和停止扫描,这是一项密集操作,可能导致 Android OS 阻止未来的扫描.
感谢您的回答。
我想让你再告诉我一个
startMonitoringBeaconsInRegion 或 startRangingBeaconsInRegion
最好在执行之前执行 removeAllMonitorNotifiers 或 removeAllRangeNotifiers?
也是停止后。
示例代码中,仅在连接服务时进行。
https://altbeacon.github.io/android-beacon-library/samples.html
应用的程序如下。
@Override
public void onBeaconServiceConnect() {
g_beaconManager.removeAllMonitorNotifiers();
g_beaconManager.removeAllRangeNotifiers();
g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
public void didEnterRegion(Region region) {
Log.d("Beacon", "didEnterRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.removeAllRangeNotifiers();
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didExitRegion(Region region) {
Log.d("Beacon", "didExitRegion Success!!");
if (g_beaconManager.getRangedRegions().size() != 0) {
try {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
g_beaconManager.removeAllRangeNotifiers();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
Log.d("Beacon", "didDetermineStateForRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.removeAllRangeNotifiers();
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
try {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
g_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) {
Beacon lBeacon_Most_Near_Distance = null;
Log.d("Beacon" , "addRangeNotifier Success!!");
for (Beacon beacon : Beacons) {
if (lBeacon_Most_Near_Distance == null)
{
lBeacon_Most_Near_Distance = beacon;
}
else
{
if (lBeacon_Most_Near_Distance.getDistance() > beacon.getDistance())
{
lBeacon_Most_Near_Distance = beacon;
}
}
}
}
});
}
当你在信标区域外时,有时会进入didEnterRegion。
有时在信标区不进入didEnterRegion。 这会持续很长时间。
终端是富士通箭矢M03。 Android™ 6.0
在didEnterRegion中可以通过didRangeBeaconsInRegion获取beacon信息
activity 被前台服务使用。
BeaconManager 在该服务中用作前台。
屏幕关闭。但是在服务中获取了wakeLock。
信标扫描间隔为4秒。 setForegroundBetweenScanPeriod (4000);
监控以 10 秒为间隔关闭/打开。
永远不要输入 didExitRegion。 我觉得需要开启监控10秒以上才能进入
didExitRegion是不是一定要生成?
最好不要每隔10秒打开/关闭监控? ON 总是更好吗?
信标检测设置
g_beaconManager = BeaconManager.getInstanceForApplication(this);
g_beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
g_beaconManager.bind(this);
g_beaconManager.setForegroundBetweenScanPeriod(4000);
g_region = new Region("iBeacon", null, null, null);
BeaconManager 服务
@Override
public void onBeaconServiceConnect() {
g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
public void didEnterRegion(Region region) {
Log.d("Beacon", "didEnterRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didExitRegion(Region region) {
Log.d("Beacon", "didExitRegion Success!!");
if (g_beaconManager.getRangedRegions().size() != 0) {
try {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
Log.d("Beacon", "didDetermineStateForRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
try {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
g_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) {
Beacon lBeacon_Most_Near_Distance = null;
Log.d("Beacon" , "addRangeNotifier Success!!");
for (Beacon beacon : Beacons) {
if (lBeacon_Most_Near_Distance == null)
{
lBeacon_Most_Near_Distance = beacon;
}
else
{
if (lBeacon_Most_Near_Distance.getDistance() > beacon.getDistance())
{
lBeacon_Most_Near_Distance = beacon;
}
}
}
}
});
}
每10秒监控一次OFF/ON
try {
if (g_beaconManager.getRangedRegions().size() != 0) {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
}
if (g_beaconManager.getMonitoredRegions().size() != 0) {
g_beaconManager.stopMonitoringBeaconsInRegion(g_region);
} else {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
}
} catch (RemoteException e) {
e.printStackTrace();
}
库在 10 秒内没有看到任何可见的信标数据包,确定它已退出一个区域。可以通过调用 BeaconManager.setRegionExitPeriod(15000); // change to 15 seconds
将此常量覆盖为您想要的任何值。如果您不让监视 运行 这么长时间,您将不会获得任何区域退出事件。
该库专为您设计,可以打开监视并长时间保持打开状态。在这么短的时间后将其关闭是自找麻烦,不仅仅是退出区域,而且会频繁启动和停止扫描,这是一项密集操作,可能导致 Android OS 阻止未来的扫描.
感谢您的回答。
我想让你再告诉我一个
startMonitoringBeaconsInRegion 或 startRangingBeaconsInRegion 最好在执行之前执行 removeAllMonitorNotifiers 或 removeAllRangeNotifiers?
也是停止后。
示例代码中,仅在连接服务时进行。 https://altbeacon.github.io/android-beacon-library/samples.html
应用的程序如下。
@Override
public void onBeaconServiceConnect() {
g_beaconManager.removeAllMonitorNotifiers();
g_beaconManager.removeAllRangeNotifiers();
g_beaconManager.addMonitorNotifier(new MonitorNotifier() {
public void didEnterRegion(Region region) {
Log.d("Beacon", "didEnterRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.removeAllRangeNotifiers();
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didExitRegion(Region region) {
Log.d("Beacon", "didExitRegion Success!!");
if (g_beaconManager.getRangedRegions().size() != 0) {
try {
g_beaconManager.stopRangingBeaconsInRegion(g_region);
g_beaconManager.removeAllRangeNotifiers();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
Log.d("Beacon", "didDetermineStateForRegion Success!!");
if (g_beaconManager.getRangedRegions().size() == 0) {
try {
g_beaconManager.removeAllRangeNotifiers();
g_beaconManager.startRangingBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
try {
g_beaconManager.startMonitoringBeaconsInRegion(g_region);
} catch (RemoteException e) {
e.printStackTrace();
}
g_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> Beacons, Region region) {
Beacon lBeacon_Most_Near_Distance = null;
Log.d("Beacon" , "addRangeNotifier Success!!");
for (Beacon beacon : Beacons) {
if (lBeacon_Most_Near_Distance == null)
{
lBeacon_Most_Near_Distance = beacon;
}
else
{
if (lBeacon_Most_Near_Distance.getDistance() > beacon.getDistance())
{
lBeacon_Most_Near_Distance = beacon;
}
}
}
}
});
}