HMS Core定位服务在生活服务类App中可以自动填写收货地址啦
在涉及团购、外卖、快递、家政、物流、搬家等生活服务类的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>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { Log.i(TAG, "check location settings success"); mFusedLocationProviderClient .requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper()) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.i(TAG, "requestLocationUpdatesWithCallback onSuccess"); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { Log.e(TAG, "requestLocationUpdatesWithCallback onFailure:" + e.getMessage()); } }); } }).addOnFailureListener(new OnFailureListener() { @Override public 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() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult != null) { List<Location> locations = locationResult.getLocations(); if (!locations.isEmpty()) { ExecutorUtil.getInstance().execute(new Runnable() { @Override public 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>>() { @Override public void onSuccess(List<HWLocation> hwLocation) { printGeocoderResult(hwLocation); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { Log.i(TAG, e.getMessage()); } }); } }); } } } @Override public void onLocationAvailability(LocationAvailability locationAvailability) { if (locationAvailability != null) { boolean flag = locationAvailability.isLocationAvailable(); Log.i(TAG, "onLocationAvailability isLocationAvailable:" + flag); } } }; }
最后将获取到的结果显示在界面上即可。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
酷瓜云课堂(内网版)v1.0.0 发布,内网学习不打样
更新内容 完成后台功能 完成点播功能 完成直播功能 完成专栏功能 完成问答功能 完成群组功能 完成微聊功能 完成积分功能 完成用户功能 系统介绍 酷瓜云课堂内网版,采用C扩展框架Phalcon开发,使用本地基础服务,无营销相关功能,主要适用于公司,学校等内部网络环境使用。 系统功能 实现了点播、直播、专栏、问答、群组、微聊、积分等。 友情提示: 演示系统配置低,带宽有限,切莫压测 课程数据来源于网络(无实质内容) 管理后台已禁止数据提交,私密配置已过滤 系统演示: 前台演示 后台演示 演示账号:100015@163.com / 123456 (前后台通用) 项目组件 后台框架:phalcon 3.4.5 前端框架:layui 2.6.8, layim 3.9.8(已授权) 全文检索:xunsearch 1.4.9 即时通讯:workerman 3.5.22 基础依赖:php7.3, mysql5.7, redis5.0 项目文档 运行环境搭建 系统服务配置 客户终端配置
- 下一篇
OpenHarmony v3.1 Release版本重磅发布!
版本概述 当前版本在OpenHarmony 3.1 Beta的基础上,更新支持以下能力: 标准系统基础能力增强 本地基础音视频播放能力、视频硬编解码、相机基础预览、拍摄能力。 RenderService新渲染框架、2D/3D绘制能力、新的动画和显示效果框架。 窗口管理新框架,提供更加灵活的窗口框架能力,支持全屏、分屏、窗口化形态,支持跨窗口拖拽能力。 display管理能力,支持分屏,并增强亮灭屏管理能力;支持窗口动画和效果。 鼠标、键盘、触摸板的基本功能支持,常见传感器加速度、陀螺仪、霍尔、马达振动等的基本能力支持。 语言区域选择、新增/增强国际化特性、系统资源、rawfile资源。 时间时区同步的支持管理能力、新增对剪贴板、锁屏服务、静态壁纸、下载服务管理能力的支持。 系统服务状态监控功能、新增跨设备oncall能力(跨设备启动FA能力)、长时、短时及延迟任务调度能力。 内存管理功能增强、电源管理基本功能支持、增进程调度功能增强等特性。 本地帐号、域帐号与本地帐号绑定功能,分布式帐号ID派生和状态管理功能,本地应用权限管理、分布式权限的管理能力。 Wi-Fi STA、AP、P2P相...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,8上快速安装Gitea,搭建Git服务器