【问题标题】:didEnterRegion event fired when out of beacon area离开信标区域时触发 didEnterRegion 事件
【发布时间】:2020-02-04 08:27:37
【问题描述】:

当你在beacon区域之外时,有时会进入didEnterRegion。

有时在信标区域时不进入 didEnterRegion。 这会持续很长时间。

终端是富士通箭头M03。 Android™ 6.0

当你在 didEnterRegion 时,你可以通过 didRangeBeaconsInRegion 获取信标信息。

活动被前台服务使用。

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 秒关闭/开启一次监控

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

【问题讨论】:

    标签: ibeacon-android


    【解决方案1】:

    库通过在 10 秒内没有看到任何可见的信标数据包来确定它已退出某个区域。可以通过调用 BeaconManager.setRegionExitPeriod(15000); // change to 15 seconds 将此常量覆盖为您想要的任何值如果您不让监控运行这么长时间,您将不会收到任何区域退出事件。

    该库旨在让您开启监控并使其长时间保持开启状态。在这么短的时间内关闭它是自找麻烦,不仅仅是区域退出,而是频繁启动和停止扫描,这是一项密集操作,可能导致 Android 操作系统阻止未来的扫描。

    【讨论】:

      【解决方案2】:

      感谢您的回答。

      我想让你告诉我另一个

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

      【讨论】:

        猜你喜欢
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 2015-08-04
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        相关资源
        最近更新 更多