仅在检测到信标一段时间时显示通知

时间:2017-04-05 10:40:27

标签: java android android-notifications monitoring ibeacon

我对andriod app编程非常陌生,想询问信标。

目前,我正在使用AltBeacon android-beacon-library来编写应用程序。我喜欢实现一个功能:

理想情况下,我希望在用户靠近特定信标时显示通知。但是,如果用户在该信标周围超过30秒,我只希望显示通知。如果用户只是走过信标,那么我不希望显示通知。

请问是否有任何现有方法?我知道有一个名为“startMonitoringBeaconsInRegion”的方法,但我真的不知道这是否是一个合适的方法。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用后台服务通过计时器获取信标可用性。当您获得信标存在时启动计时器并在30秒后触发通知如果信标在位置可用30秒,则重置计时器。

信标背景搜索:http://developer.estimote.com/android/tutorial/part-2-background-monitoring/

以上教程链接看起来很有希望

    //start when found beacon in background

   Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {

                        getActivity().runOnUiThread(new Runnable() {
                            public void run() {
                                try {
                                 //send notification
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                }, 30000);

//如果信标状态为false或不可用,则重置

   if (timer != null) {
   timer.cancel();
   }

答案 1 :(得分:0)

您可以使用范围轻松地使用Android Beacon Library轻松实现此功能。按照常规教程设置范围。然后在你的测距回调中添加如下代码:

HashMap<String,Long> beaconDetections = new HashMap<String,Long>();

public void didRangeBeaconsInRegion(Region region, Collection<Beacon> beacons) {
  Long now = System.currentTimeMillis();
  for (Beacon beacon : beacons) {
    Long firstDetectionTime = beaconDetections.get(beacon.toString());
    if (firstDetectionTime != null) {
      if (now-firstDetectionTime > 30000l) {
        // Put logic here for if beacon seen for 30 secs or more
      }
    }
    else {
      beaconDetections.put(beacon.toString(), now);   
    }
  }
}

上面的代码使用HashMap跟踪第一次看到每个信标的时间,然后在每次回调时执行特殊逻辑,如果它已经被看到30秒或更长时间。