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

sea*_*_cr 0 android openstreetmap push-notification osmdroid android-geofence

我想创建一个简单的地图应用程序,当设备的地理位置进入地理围栏时发送推送通知。我一直在寻找一种在 osmdroid 上显示地理围栏的方法。我一直看到的是谷歌地图的例子。但是,我没有使用谷歌地图。我是否仍然需要使用 Google 相关的实现(GoogleApiClient 等),或者有没有办法在没有 google 的情况下生成地理围栏?如何收听地理围栏转换(进入和退出地理围栏)然后发送推送通知?

Jos*_*cik 5

要了解的最重要的事情是 GeoFencing 根本与地图无关。Google 将其作为 Map API 的一部分呈现,因为它是同一个域,从这个角度来看是有道理的。

但从技术上讲,它只是这样:

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

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

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

1)观察位置

您可以使用LocationManager 和 requestLocationUpdates 并自行观察设备的位置。如果您希望应用程序在地理围栏发生时处于前台,这应该很容易。但是,如果您需要在您的应用程序处于后台时查看设备的位置,这将变得很棘手。谷歌限制了应用程序在每次发布时在后台执行任务的能力,他们这样做是有充分理由的——电池。

在这种情况下建议的方法(实际上,谷歌建议在需要处理设备位置的每种情况下使用这种方法)是使用FusedLocationProvider,它是 Google Play 服务库的一部分。这会产生一些后果(它仅适用于安装了 Google Play 商店的设备,但也可以节省电池和资源)。

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

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

3) 显示通知

在 Android 上显示通知很容易。您甚至不需要推送通知,在这种情况下它们毫无意义。该应用程序知道它想要显示通知,因此没有理由让云中的某些服务器将通知推送到设备。

您应该使用 Google 的实现吗?

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

该 API 是 Google Play 服务库的一部分 - 与我之前提到的 FusedLocationProvider API 的方式相同。因此,如果您选择自己实现但决定使用 FusedLocationProvider,您将承担使用 google play 服务库的所有后果,但还要编写更多代码,并有更多机会犯错。这样的做法是没有意义的。