在涉及团购、外卖、快递、家政、物流、搬家等生活服务类的App、小程序中,填写收货地址是用户高频使用的功能。这一功能通常采取让用户手动填写的解决方案,例如上下拉动选择浙江省–>杭州市–>西湖区–>西溪街道,再切换到姓名输入框输入姓名–>电话输入框输入电话等一系列的操作。从中我们不难发现手动输入地址不仅费时费力,而且一不小心还会出现选错地址的现象。

那有没有什么方法能帮助用户又快又准确的填写地址呢?借助HMS Core 定位服务的融合定位+地理编码能力,生活服务类App可以自动定位获取用户当前位置信息或某地的行政区划信息、街道信息,并准确填写至地址栏中。用户无需自己手动输入,减少了操作时间,并且不用再担心填错地址。以下是我们提供的示例代码,开发者们按照步骤尝试,就可以轻松体验这个功能啦~

效果展示

开发实战

开发步骤

一、 开发准备

1. 登录AppGallery Connect网站,点击“我的项目”。找到您的项目在API管理开启location开关,在项目中点击需要配置签名证书指纹的应用。在“项目设置 > 常规”页面的“应用”区域,点击“SHA256证书指纹”后的“添加证书指纹”,输入生成的SHA256指纹。

2. 在“项目设置 > 常规”页面的“应用”区域,点击“agconnect-services.json”下载配置文件。将“agconnect-services.json”文件拷贝到应用级根目录下。

3. 项目级“build.gradle”文件

buildscript {repositories {google()jcenter()maven { url 'https://developer.huawei.com/repo/' }mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:4.1.2'classpath 'com.huawei.agconnect:agcp:1.6.0.300'}
}allprojects {repositories {maven { url 'https://developer.huawei.com/repo/' }google()jcenter()mavenCentral()}
}

应用级的“build.gradle”文件

plugins {id 'com.android.application'id 'com.huawei.agconnect'
}

在“dependencies ”中添加如下编译依赖

implementation 'com.huawei.hms:location:6.3.0.300'

二、 权限检查

1. 在“AndroidManifest.xml”文件中配置权限ACCESS_COARSE_LOCATION(粗略的位置权限),ACCESS_FINE_LOCATION(精确的位置权限)和ACCESS_BACKGROUND_LOCATION权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

2. 动态申请定位相关权限(Android 6.0及以上版本危险权限要求)

    Log.i(TAG, "android sdk < 28 Q");if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {String[] strings ={Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};ActivityCompat.requestPermissions(this, strings, 1);}
} else {if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED&& ActivityCompat.checkSelfPermission(this,"android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {String[] strings = {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,"android.permission.ACCESS_BACKGROUND_LOCATION"};ActivityCompat.requestPermissions(this, strings, 2);}
}

三、 获取定位结果

1. 设置定位参数,包括位置更新的间隔,定位类型等

mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
mSettingsClient = LocationServices.getSettingsClient(this);
mLocationRequest = new LocationRequest();
// Sets the interval for location update (unit: Millisecond)
mLocationRequest.setInterval(5000);
// Sets the priority
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

2. 调用getSettingsClient()接口获取SettingsClient实例。调用调用checkLocationSettings()检查设备开关设置

LocationSettingsRequest locationSettingsRequest = builder.build();
// Before requesting location update, invoke checkLocationSettings to check device settings.
Task<LocationSettingsResponse> locationSettingsResponseTask =mSettingsClient.checkLocationSettings(locationSettingsRequest);

检查开关开启之后 ,调用requestLocationUpdates()进行定位

locationSettingsResponseTask.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {@Overridepublic void onSuccess(LocationSettingsResponse locationSettingsResponse) {Log.i(TAG, "check location settings success");mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper()).addOnSuccessListener(new OnSuccessListener<Void>() {@Overridepublic void onSuccess(Void aVoid) {Log.i(TAG, "requestLocationUpdatesWithCallback onSuccess");}}).addOnFailureListener(new OnFailureListener() {@Overridepublic void onFailure(Exception e) {Log.e(TAG, "requestLocationUpdatesWithCallback onFailure:" + e.getMessage());}});}
}).addOnFailureListener(new OnFailureListener() {@Overridepublic void onFailure(Exception e) {Log.e(TAG, "checkLocationSetting onFailure:" + e.getMessage());int statusCode = 0;if (e instanceof ApiException) {statusCode = ((ApiException) e).getStatusCode();}switch (statusCode) {case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:try {// When the startResolutionForResult is invoked, a dialog box is displayed, asking you// to open the corresponding permission.if (e instanceof ResolvableApiException) {ResolvableApiException rae = (ResolvableApiException) e;rae.startResolutionForResult(MainActivity.this, 0);}} catch (IntentSender.SendIntentException sie) {Log.e(TAG, "PendingIntent unable to execute request.");}break;default:break;}}
});

四、 逆地理编码获取当前位置

成功获取定位信息的经纬度之后,将经纬度信息传递给使用地理编码服务(GeocoderService)获得地理编码请求对象,然后调用请求逆地理编码方法(getFromLocation),设置请求(GetFromLocationRequest)参数,获取逆地理编码信息回调。

if (null == mLocationCallback) {mLocationCallback = new LocationCallback() {@Overridepublic void onLocationResult(LocationResult locationResult) {if (locationResult != null) {List<Location> locations = locationResult.getLocations();if (!locations.isEmpty()) {ExecutorUtil.getInstance().execute(new Runnable() {@Overridepublic void run() {Locale locale = new Locale("zh", "CN");GeocoderService geocoderService = LocationServices.getGeocoderService(MainActivity.this, locale);GetFromLocationRequest getFromLocationRequest = new GetFromLocationRequest(locations.get(0).getLatitude(), locations.get(0).getLongitude(), 1);geocoderService.getFromLocation(getFromLocationRequest).addOnSuccessListener(new OnSuccessListener<List<HWLocation>>() {@Overridepublic void onSuccess(List<HWLocation> hwLocation) {printGeocoderResult(hwLocation);}}).addOnFailureListener(new OnFailureListener() {@Overridepublic void onFailure(Exception e) {Log.i(TAG, e.getMessage());}});}});}}}@Overridepublic void onLocationAvailability(LocationAvailability locationAvailability) {if (locationAvailability != null) {boolean flag = locationAvailability.isLocationAvailable();Log.i(TAG, "onLocationAvailability isLocationAvailable:" + flag);}}};
}

最后将获取到的结果显示在界面上即可。

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

HMS Core定位服务在生活服务类App中可以自动填写收货地址啦相关推荐

  1. 澎湃新闻产品总监首度分享,如何快速在新闻类APP中异军突围?一年时间进入前4名...

    2014年7月22日,由上海报业集团打造的澎湃新闻客户端正式上线.作为首批试水新媒体的国家队纸媒,自诞生之日起,澎湃新闻一直在媒体的聚光灯下,无论是产品设计.UI还是运营模式,都收到广泛关注,褒贬不一 ...

  2. 关于直播类app中的推流、拉流技术(转载)

    关于直播类app中的推流.拉流技术 from:https://blog.csdn.net/lzllzllhl/article/details/80249069 图像处理:iOS端一般会用到GPUIma ...

  3. 关于直播类app中的推流、拉流技术

    虽然直播app在2016年的时候就很火了,但是对于我这样的技术菜逼来说,从来没有真正的去了解过,而对于这方面的技术,我就更是不了解了.由于最近的项目中可能会用到直播之类的功能,所以就赶紧来恶补一下这方 ...

  4. 【HMS Core】统一扫码服务中的RemoteView如何修改视图比例?

    1.问题描述 项目中有一个需求:将扫码视图设置为正方形. 详情如下图所示: 目前默认的视图是按屏幕比例展示的,将视图设置为正方形时,视图的Y轴将会被压缩,现在的问题是: 该View是否支持自定义比例展 ...

  5. 腾讯地图类快递自动填写收发货地址功能

    开发场景 获取当前位置信息或者某地的行政区划信息或者街道信息,实现类似电商平台填写收货地址功能. 技术选型 微信小程序JavaScript SDK 微信小程序插件 确定业务逻辑及页面设计 以简洁大气为 ...

  6. 微信小程序类快递自动填写收发货地址功能

    开发场景 获取当前位置信息或者某地的行政区划信息或者街道信息,实现类似电商平台填写收货地址功能. 技术选型 微信小程序JavaScript SDK 微信小程序插件 确定业务逻辑及页面设计 以简洁大气为 ...

  7. 深耕图形服务,HMS Core 5.0携手开发者共创视觉盛宴

    在今年HDC大会分论坛上,华为向业界和广大开发者展示了HMS Core 5.0在图形服务(Graphics)的最新成果,图形服务(Graphics)是2020年6月上线的HMS Core 5.0七大领 ...

  8. 【HMS Core】华为登录后返回错误码 8 、账号服务如何授权、推送服务端获取用户信息异常

    1.[HMS core][游戏登陆][问题描述] 调用华为登录后返回错误码 8 [解决方案] 错误码8的话一般在定义为内部错误(引起该错误码的原因很多),但是一般重试基本可以解决该问题(错误码).如果 ...

  9. 携手HMS Core统一扫码服务, 兴业证券优理宝App提升用户扫码体验

    兴业证券优理宝App联合华为HMS Core,集成HMS Core统一扫码服务,在提升扫码成功率的同时,还支持C端用户用手机端APP扫描手表端二维码,实现行情在手机与手表间跨终端流转,行情信息,抬腕可 ...

最新文章

  1. Access denied for user 'root'@'localhost' 解决流程
  2. A Complete List of .NET Open Source Developer Projects
  3. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第6章-操作度优化条件下的移动机械臂协同搬运控制
  4. 下拉插件dropload js时间计算(几天前)
  5. sonar 中质量指标(度量)
  6. java基本数据类型以及相关内容总结
  7. VNC服务的使用和使用qemu-img工具创建更多格式的磁盘映像文件
  8. 计算机仿真图中的数码管元件库中叫,Multisim仿真软件在电子电路设计中的应用...
  9. 五面阿里拿下飞猪事业部offer,统统给你解决!
  10. 在ANSYS WORKBENCH中使用APDL命令的例子
  11. html狙击瞄准特效,如何给视频加特效:制作电影中狙击场景效果 望远镜效果视频...
  12. 电子商务系统建设(十一)
  13. 原来路由器也属于消耗品
  14. ftp上传老是失败 [L] TYPE A [L] 200 Type set to A. [L] MODE Z [L] 200 MODE Z ok. [L] PASV [L] 550 Pa
  15. January 04th, 2018 Week 01st Thursday
  16. 【stm32】delay详解
  17. 福州计算机软件培训学校,福州计算机办公软件应用培训
  18. 100G波分复用(WDM)宽带传输设备
  19. 在 R 中估计 GARCH 参数存在的问题
  20. 决策树模型之泰坦尼克号乘客是否生还预测

热门文章

  1. python幼儿编程-人工智能的御用语言Python,孩子也能学?
  2. ChatGPT 通过谷歌算法面试,年薪 18.3 万美金
  3. C语言 猜数字游戏
  4. GRUB启动命令详解
  5. python画笑脸图案-怎么用python实现画笑脸
  6. 数据权限实现方案遐想
  7. 【微信小程序】WXSS模板样式 —— 页面配置
  8. 解决win7有些硬盘不能扩展卷的问题
  9. 每天如履薄冰战战兢兢地面对工作,要跳槽吗?
  10. VBA—EXCEL操作集合—03