Blog Details

  • Home  
  • 定位服务(HMS Toolkit)

定位服务(HMS Toolkit)

Coding Assistant为Location接入提供了API接口和代码样例,方便开发者快速集成。集成方法有如下两种:

场景集成:您只需要通过简单的拖拽场景卡片即可完成对应场景的集成。

API接口调用:支持通过简单的拖拽/复制API接口的代码样例即可完成对应接口的调用。

提示:开发者可根据自身需要,自行选择集成方式。

以"Location Service Development Procedure(定位服务开发处理)"为例,分别介绍场景集成、API接口调用,其他场景操作同定位服务开发处理场景类似。

场景集成

通过"HMS > Coding Assistant"或者在工具栏中点击如下图标打开Coding Assistant,然后在Kit列表中点击"Location Kit",显示如下图所示的Location场景列表。

当需要调用"Location Service Development Procedure"场景时,在场景列表中找到对应的场景卡片,然后将场景卡片拖拽到代码编辑区。在拖动场景卡片的同时,工具会自动生成对应的Activity文件和xml布局文件,并在AndroidManifest、工程下的build.gradle和模块下的build.gradle文件中写入配置信息和工程运行所需要的依赖。如果需要打开对应场景的Activity,需要您在代码中主动调用该Activity,调用完成后,您可以直接在设备中运行应用。

API接口调用

当不需要场景集成方式时,您可以在对应的API接口列表中,点击某一个API接口进入详情页,然后选择拖拽的方式将接口对应的代码样例片段拖到代码中,这种方式需要您知道拖拽代码的位置。同样的,工具会自动在工程下的build.gradle和模块下的build.gradle文件中写入工程运行所需要的依赖。点击"Location Service Development Procedure"图标进入API接口详情界面,详情界面展示了集成所需要调用API的功能介绍。

根据详情界面的API功能介绍,通过"拖拽"或者"复制"代码块的方式,将API代码放到相应的代码中。

提示:配置文件只能"复制";代码块既可"拖拽"也能"复制"。

指定应用权限

Android提供了两种位置权限: ACCESS_COARSE_LOCATION(粗略的位置权限)和ACCESS_FINE_LOCATION(精确的位置权限)。需要在Manifest文件中申请权限,点击复制,添加到Manifest文件中。

在Android Q版本中,如果您需要应用程序在后台执行时也具备持续定位能力,需要在Manifest文件中申请ACCESS_BACKGROUND_LOCATION权限,点击复制按钮,手动复制添加。

在Manifest中添加后,还要在代码中动态申请一下权限(Android 6.0危险权限要求),拖拽或复制粘贴添加到RequestLocationUpdatesWithCallbackActivity.Java文件,后续步骤均往RequestLocationUpdatesWithCallbackActivity.Java文件添加Java代码。

创建定位服务客户端

在该Activity的onCreate()方法中创建一个FusedLocationProviderClient实例,通过该实例调用定位相关接口,拖拽或复制粘贴添加。

检查设备定位设置

设备的相关定位设置会影响定位服务的定位结果,例如位置开关选项处于关闭状态时,将无法获取到位置信息。因此,建议您在持续获取位置信息之前,先检查设备设置是否满足定位条件。定位服务提供了检查设备定位相关设置的能力,通过LocationServices的getSettingsClient(Activity activity)获取SettingsClient实例,然后调用checkLocationSettings(LocationSettingsRequest locationSettingsRequest)接口获取定位设置结果,当设置不满足定位条件时,将为您提供解决方案以提示用户打开对应的权限(HMS Core定位权限必须打开,Android Q版本必须选择"始终允许")。

获取SettingsClient的服务接口,拖拽或复制粘贴添加。

调用checkLocationSettings()检查设备设置,拖拽或复制粘贴添加。

持续获取位置信息

如果您希望应用可以持续获取设备位置,可以使用定位服务提供的requestLocationUpdates()接口。该接口根据入参形式的不同,将以两种不同的形式将位置信息返回。一种是通过调用您已经定义的LocationCallback类中onLocationResult()回调方法返回一个包含位置信息的LocationResult对象,另一种是将位置信息置于PendingIntent扩展信息中返回。

当您的应用程序不再需要接收位置更新时,应当停止位置更新,以便于降低功耗。要停止位置更新,可以调用removeLocationUpdates(),传入与requestLocationUpdates()接口相对应的LocationCallback或PendingIntent对象。这里以回调方式作为样例,代码如下。详细的参数说明请参见Location接口说明。

设置持续定位请求参数,拖拽或复制粘贴添加。

定义位置更新回调,拖拽或复制粘贴添加。

调用requestLocationUpdates()进行持续定位,拖拽或复制粘贴添加。

提示:如果接口调用成功,获取位置信息失败,请参见接口调用成功,获取不到位置信息。

调用removeLocationUpdates()停止位置更新,拖拽或复制粘贴添加。

注意:停止位置更新时,mLocationCallback必须与requestLocationUpdates方法中的LocationCallback参数为同一对象。

获取最后的已知位置

使用定位服务API,您的应用程序可以获取设备最后的已知位置,大多情况下,该位置即为设备的当前位置。调用getLastLocation()方法获取最后的已知位置的代码样例如下,拖拽或复制粘贴添加。

使用模拟位置信息功能

具体操作步骤:打开"设置 > 系统和更新 > 开发人员选项 > 选择模拟位置信息应用 > 选择要mock的应用"(如果没有发现"开发人员选项",请执行如下操作:"设置 > 关于手机 > 版本号",连续点击"版本号"7次,"开发人员选项"会出现在"系统与更新"页面,再重复上述操作),代码开发步骤如下:

在AndroidManifest.xml文件中配置模拟定位权限。

设置mock模式,调用setMockMode(boolean isMockMode) ,拖拽或复制粘贴添加。

设置模拟位置信息,调用setMockLocation(Location mockLocation) ,拖拽或复制粘贴添加

最后主Activity需要调用该集成Location Kit的RequestLocationUpdatesWithCallbackActivity