HMSCore位置服务可以在生活服务类应用中自动填写收货地址高频使用功能。该功能通常采用用户手动填写的方案,比如上下下拉选择浙江省-->杭州市-->西湖区-->西溪街道,然后切换到姓名输入框输入姓名-->电话输入框进入打电话等一系列操作。由此不难发现,手动输入地址不仅费时费力,一不小心还会出现选错地址的现象。那么有什么方法可以帮助用户快速准确地填写地址呢?借助HMSCore定位服务的综合定位+地理编码能力,生活服务类APP可以自动定位获取用户当前位置信息或某地的行政区划信息、街道信息,并准确填写地址栏.用户无需手动输入,减少了操作时间,再也不用担心填错地址了。以下是我们提供的示例代码。开发者可以按照以下步骤轻松体验该功能~效果展示实践开发开发步骤一、开发准备1、登录AppGalleryConnect网站,点击“我的项目”。在API管理中找到你的项目并打开位置开关,在项目中点击需要配置签名证书指纹的应用。在“项目设置>通用”页面的“应用”区域,点击“SHA256证书指纹”旁边的“添加证书指纹”,输入生成的SHA256指纹。2、在“项目设置>通用”页面的“应用”区域,点击“agconnect-services.json”下载配置文件。将“agconnect-services.json”文件复制到应用程序级根目录。3.项目级“build.gradle”文件.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”文件插件{id'com.android.application'id'com.huawei.agconnect'}添加如下编译依赖implementation'com.huawei.hms:location:6.3.0.300'二、权限检查1、在“AndroidManifest.xml”文件中配置权限ACCESS_COARSE_LOCATION(粗定位权限)、ACCESS_FINE_LOCATION(精定位权限)和ACCESS_BACKGROUND_LOCATION权限2.动态申请确定位置相关权限(Android6.0及以上版本危险权限要求)Log.i(TAG,"androidsdk<28Q");如果(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=newLocationRequest();//设置位置更新的时间间隔(单位:毫秒)mLocationRequest.setInterval(5000);//设置优先级mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);2.调用getSettingsSettingsClientClient()实例获取调用调用checkLocationSettings()检查设备开关设置LocationSettingsRequestlocationSettingsRequest=builder.build();//Beforerequestinglocationupdate,invokecheckLocationSettingstocheckdevicesettings.TasklocationSettingsResponseTask=mSettingsClient.checkLocationSettings(locationSettingsRequest);检查开关开启之后,调用requestLocationUpdates()执行定位locationSettingsResponseTask.addOnSuccessListener(newOnSuccessListener(){@OverridepublicvoidonSuccess(LocationSettingsResponselocationSettingsResponse){Log.i(TAG,"checklocationsettingssuccess");mFusedLocationProviderClient,mLocationUpdates,mLocationRequestCallback(mLocationRequestCallback)Looper.getMainLooper()).addOnSuccessListener(newOnSuccessListener(){@OverridepublicvoidonSuccess(VoidaVoid){Log.i(TAG,"requestLocationUpdatesWithCallbackonSuccess");}}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(Exceptione){Log.e(TAG,"requestLocationUpdatesWithCallbackonFailure:"+e.getMessage());}});}}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(Exceptione){Log.e(TAG,"checkLocationSettingonFailure:"+e.getMessage());intstatusCode=0;if(einstanceofApiException){statusCode=((ApiException)e).getStatusCode();}switch(statusCode){caseLocationSettingsStatusCodes.RESOLUTION_REQUIRED:try{//当调用startResolutionForResult时,会弹出一个对话框,询问你//开启相应的权限。if(einstanceofResolvableApiException){ResolvableApiExceptionrae=(ResolvableApiException)e;rae.startResolutionForResult(MainActivity.this,0);}}catch(IntentSender.SendIntentExceptionsie){Log.e(TAG,"PendingIntent无法执行请求。");}休息;默认值:中断;}}});4.反向地理编码获取当前所在位置的经纬度并成功获取定位信息后,将经纬度信息传递给地理编码服务(GeocoderService)获取地理编码请求对象,然后调用请求反向地理编码方法(getFromLocation),设置请求(GetFromLocationRequest)参数,获取反向地理编码信息回调if(null==mLocationCallback){mLocationCallback=newLocationCallback(){@OverridepublicvoidonLocationResult(LocationResultlocationResult){if(locationResult!=null){Listlocations=locationResult.getLocations();if(!locations.isEmpty()){ExecutorUtil.getInstance().execute(newRunnable(){@Overridepublicvoidrun(){Localelocale=newLocale("zh","CN");GeocoderServicegeocoderService=LocationServices.getGeocoderService(MainActivity.this,locale);GetFromLocationRequestgetFromLocationRequest=newGetFromLocationRequest(locations.get(0).getLatitude(),locations.get(0).getLongitude(),1);geocoderService.getFromLocation(getFromLocationRequest)...e){Log.i(TAG,e.getMessage());}});}});}}}@OverridepublicvoidonLocationAvailability(LocationAvailabilitylocationAvailability){i