我创建了一个应用,用户首先可以选择将latitude
和longitude
添加到SQLite
数据库,以便在他们进入注册区域时触发Notification
。
之后我使用保存在数据库中的LatLng
添加了标记。我使用通知来显示警报。
问题:我的问题是,如果我在标记半径内停留一段时间,它会继续发出通知。
任何知道解决方案的人只有在我进入邻近区域时才会发射一次并在我重新进入该区域时再次开火。提前谢谢。
答案 0 :(得分:0)
简单的解决方案是保存您是否已发出通知,然后在您第一次发现自己位于该区域外时重置通知:
bool notified = false;
if(inArea() && !notified)
notify();
notify = true;
else if(!inArea and notified)
notified= false;
答案 1 :(得分:0)
计算圆,中心点及其存在位置之间的差异:
Location locationA = new Location("point A");
locationA.setLatitude(latitude_center);
locationA.setLongitude(longitude_center);
Location locationB = new Location("point B");
locationB.setLatitude(lat_current);
locationB.setLongitude(lng_current);
float distance = locationA.distanceTo(locationB);
if(radius < distance){
// fire alert
}
答案 2 :(得分:0)
你可能应该考虑包括一定程度的hysterisis ...当你进入该区域和离开时之间的重叠。您需要两个半径:当您进入目标区域时,较小的半径定义;当你离开它时,更大的定义。然后,您将这些内容合并到类似于Astrogat的答案:
bool notified = false;
...
if(inArea(innerRadius) && !notified) {
notify();
notify = true;
} else if(!inArea(outerRadius) && notified) {
notified= false;
}
单个半径的优势在于,这将阻止您在&#34; in&#34;之间切换。和&#34; out&#34;当你只是在目标区域的边缘时。
另请注意,notified
变量需要在调用&#34时保持不变;如果我们通知&#34;逻辑。