有没有办法在Android上使用开放式街道地图生成地理围栏?

时间:2019-04-16 21:06:53

标签: android push-notification openstreetmap osmdroid android-geofence

我想创建一个简单的地图应用,每当设备的地理位置进入地理围栏时,该应用就会发送推送通知。我一直在尝试寻找一种在osmdroid上显示地理围栏的方法。我一直看到的是Google Map示例。但是,我没有使用Google Maps。我是否仍需要使用与Google相关的实现(GoogleApiClient等),或者是否可以在没有Google的情况下生成地理围栏?听听地理围栏过渡(进入和退出地理围栏)然后发送推送通知怎么样?

1 个答案:

答案 0 :(得分:2)

最重要的一点是,GeoFencing根本与地图无关。 Google将其作为其Map API的一部分呈现,因为它是同一个域,并且从该角度来看很有意义。

但是从技术上讲就是这样:

  1. 及时使用位置服务观察设备的位置
  2. 将位置与一组“地理范围”进行比较(假设 这些只是点数+距离)。
  3. 如果该位置碰到了地理围栏,请执行一些操作-例如显示通知。

Osmdroid为您提供了一种在应用程序中显示图形地图以及这些地图上的一些叠加层的方式。有一些扩展允许您合并其他内容(例如设备的当前位置,路由),但大多数情况下它们只是您要主要显示在地图上的内容。如果只想使用地理围栏,则根本不需要使用Osmdroid。如果您想要在应用程序中使用地图,则可以选择使用Osmdroid库并独立实现地理围栏。

关于goefencing的实现:从技术上讲,您可以在没有google的情况下做到这一点。

1)观察位置

您可以使用LocationManager and requestLocationUpdates自己观察设备的位置。如果您希望地理围栏发生时应用程序处于前台,那么这应该很容易。但是,如果您需要在应用程序处于后台运行时查看设备的位置,则会遇到麻烦。 Google限制了应用程序在每个版本中在后台执行操作的能力,这是有充分理由的-电池。

在这种情况下,建议的方法(实际上,谷歌建议在每种情况下都需要使用设备的位置,建议使用这种方法)是使用a FusedLocationProvider,它是Google Play服务库的一部分。这会带来一些后果(仅在安装了Google Play商店的设备上有效,而且还可以节省电池和资源)。

2)拥有地理围栏列表,并与它们比较收集的位置

这很容易,并且有几种方法可以实现这种功能。如果将“地理范围”的定义限制为距给定点的最大距离,则执行测试位置是否在地理范围内的代码的过程也很容易-您只需计算到地理中心的距离即可。地理围栏并将其与直径进行比较。

3)显示通知

Showing notification is easy on Android。您甚至不需要推送通知,在这种情况下,它们将毫无意义。该应用程序知道它要显示通知,因此没有理由在云中使用某些服务器将通知发送到设备。

您应该使用Google提供的实施方案吗?

Google为您实现了大部分功能,并提供了易于使用的API。因此,如果您没有任何理由避免Google的实施,建议您使用它。它们的实现在内部应与我上面所述的相同,并且不涉及对(可能)付费API的API调用。

API是Google Play服务库的一部分-与我前面提到的FusedLocationProvider API相同。因此,如果您选择执行自己的实现,但决定使用FusedLocationProvider,则将拥有使用Google Play服务库的所有后果,但还会有更多的代码编写和更多的出错机会。这种方法根本没有道理。