Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android
Code

如何使用Android中的Geofences

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

位置感知资源允许您的应用程序与物理世界进行交互,它们是增加用户参与度的理想选择。虽然许多移动应用程序都使用它们,但本教程的主题是一个经常被忽略的功能,那就是geofencing

geofencing是在真实地理区域上设置的虚拟周界。将用户位置与geofencing周界组合,可以知道用户是在geofencing内还是geofencing外,或者甚至他是正在退出或进入该区域。

A geofence knows if a location is inside or outside its delimited area

想象一下,一个大学应用程序可以告诉你目前校园里有哪些同事和教授。或者一个商场应用程序,奖励普通客户。还有许多其他有趣的可能性等待你探索。

在本教程中,您将学习如何在Android上使用geofencing,方法是创建一个应用程序,用户进入或退出geofencing时向用户发送通知。 如果您以前了解  Google Play服务,  Google Maps Android API或  IntentService,这会有所帮助。如果没有也没有问题,但是阅读本教程后,您可能需要对这些主题进行一些研究。

1.Android中的geofencing

在Android中有几种方法使用geofencing。您甚至可以自己实现geofencing,但Google  GeofencingApi更容易使用。

这些API是Google的  Location  API的一部分。它包括  GeofenceGeofencingRequestGeofenceApi,  GeofencingEvent,和  GeofenceStatusCodes。在本教程中,我们使用这些类来创建和使用geofencing。

geofencing界面

Geofence 是一个表示应该监视的地理区域的界面。它是通过Geofence.Builder来创建。 在创建过程中,您可以设置受监视区域,geofencing的到期日期,响应度,标识符以及应该查找的转换种类。

为了将功耗降至最低,建议在大多数情况下使用半径至少为100米的geofencing。如果geofencing位于农村,则应将半径增加到500米以上,以确保地geofencing有效。

geofencing转型

  • GEOFENCE_TRANSITION_DWELL 表示用户进入该区域并停留一段时间。 当用户进入和退出区域太快时,避免多个警报是有用的。您可以使用setLoiteringDelay参数配置住宅时间  。
  • GEOFENCE_TRANSITION_ENTER 指示用户何时进入监视区域。
  • GEOFENCE_TRANSITION_EXIT  指示用户何时退出该区域。

GeofenceRequest

  GeofencingRequest 类接收了应该监视的geofencing。您可以通过使用Builder创建实例,传递参数GeofenceList<Geofence>,以及在创建geofencing时触发的通知类型。

GeofencingApi

GeofencingApi 类是与Google的geofencing API进行交互的切入点。它是Location API的一部分,它取决于  GoogleApiClient 工作。您将使用GeofencingApi添加和删除geofencing。

要添加geofencing,您可以调用addGeofence()方法。它使用传递给GeofencingRequest 的设置来监视给定区域,并且 在移动,进入或退出该区域时发射PendingIntent

要删除geofencing,请调用  removeGeofences()。您可以使用其请求标识符或其挂起的意图来移除geofencing。

2.创建geofencing应用程序

在本教程中,我们创建一个简单的应用程序,用于监视用户位置,并在用户进入或退出地理区域时发送通知。 该应用程序仅包含一个Activity和一个IntentService。我们也快速浏览GoogleMapGoogleApiClientFusedLocationProviderApi,并且我们探索了geofencing API的一些注意事项。

App Screenshot

步骤1:项目设置

GeofencingApiGoogle Play服务的一部分。需要正确设置您的开发环境并创建一个GoogleApiClient实例才能访问它。 创建一个空白Activity的项目,编辑项目的build.gradle文件,如下所示,并同步您的项目。

步骤2:权限

我们需要设置正确的权限来创建和使用geofencing。将以下权限添加到项目的清单中:

从Android 6.0开始,应用程序在运行时请求权限而不是在安装期间。我们稍后在本教程中介绍。

步骤3:创建布局

该项目由MainActity布局组成。它包含设备的当前纬度和经度,以及 显示地理位置和用户位置的  GoogleMap fragment。

由于activity_main.xml非常简单,我只想集中在MapFragment上。您可以在本教程的源文件中查看完成的布局。

步骤4:Google Maps API密钥

由于我们使用 MapFragment,我们需要设置和初始化一个GoogleMap实例。首先,您需要获得一个API密钥。一旦你有一个API密钥,将它添加到项目的清单。

我们从GoogleMap 实例开始吧。在  Activity类中实现  GoogleMap.OnMapReadyCallback,  GoogleMap.OnMapClickListener和  GoogleMap.OnMarkerClickListener并初始化地图。

步骤5: GoogleApiClient

要使用  GeofencingApi 接口,我们需要一个GoogleApiClient 入口点。让我们实现Activity中的GoogleApiClient.ConnectionCallbacks和  GoogleApiClient.OnConnectionFailedListener,如下图所示。

步骤6: FusedLocationProviderApi

我们还需要访问用户的当前位置。FusedLocationProviderApi 接口为我们提供了这些信息,并且可以很好地控制位置请求。 这是非常重要的,因为位置请求对设备的电池消耗有直接的影响。

现在,我们来实现一个LocationListener。检查用户是否通过创建Location请求给出应用程序相应的权限,并在屏幕上显示当前位置。

重要的是解决上面创建的LocationRequest未针对生产环境进行优化的问题。UPDATE_INTERVAL过短,会消耗过多电量。更合适的生产配置可以是:

第7步:GoogleMap标记

我们Activity需要两个不同的标记locationMarker 使用FusedLocationProviderApi给出的纬度和纬度   来通知设备的当前位置。 geoFenceMarker 是geofence创建的目标,因为它使用地图上给出的最后一个触摸来检索其位置。

步骤8:创建geofence

最后,现在是建立geofence的时候了。我们用  geoFenceMarker作为 geofence中心点。

接下来,我们创建GeofencingRequest对象。

我们使用一个PendingIntent 对象来调用IntentService来处理  GeofenceEvent。我们创造了  GeofenceTrasitionService.class以后。

我们还在地图上绘制geofence作为视觉参考。

startGeofence() 方法负责启动MainActivity 类中的geofence进程  。

步骤9:geofence转型服务

我们现在可以最终创建前面提到的GeofenceTrasitionService.class 。这个类继承  IntentService 并负责处理GeofencingEvent。首先,我们从收到的意图中得到这个事件。

然后,我们检查发生的geofence转型的类型是否是我们感兴趣的。如果是,我们检索触发geofence的列表,并通过适当的操作创建通知。

我还实现了一些帮助方法,使类的实现更容易理解。

3.测试

在虚拟设备上进行测试

在虚拟设备上测试geofence要简单得多。有几种方法可以做到这一点。在Android Studio中,打开一个虚拟设备,然后点击右下角的更多选项按钮。

Click on More Options

在左侧的位置选项卡中,输入位置的坐标。

Send Latitude and Longitude

我更喜欢使用telnet命令来控制虚拟设备。要使用此功能,您需要使用以下命令从命令行连接到设备:

设备端口显示在虚拟设备窗口中。设备端口通常等于5554

您可能需要使用您的auth_token权限来授权此连接  ,但是命令行可以显示您所在的位置。导航到该位置复制令牌并键入  auth [YOUR_AUTH_TOKEN]

您现在可以通过运行以下命令来设置设备的位置:

结论

Geofencing可能是您应用程序的一个很好补充,因为它可以大大增加用户参与度。有很多的可能性有待探索,甚至可以使用室内信标(如Estimote)获取一个复杂的经验。 有了室内信标,你就会知道用户从哪里经过,例如购物中心。

将Geofencing添加到项目很简单,但是我们需要始终保持电池的续航能力。这意味着我们需要仔细选择geofence的大小和更新率,因为它们都直接影响到应用程序的功耗。

因此,测试应用程序的功耗非常重要。还要考虑给用户一个选项,如果他们不想要或者不需要这个功能,就完全禁用geofencing。

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.