如果您的应用需要请求更高精度的(亚米级的)位置信息,首先您需要为应用申请位置权限,然后调用请求位置更新方法(requestLocationUpdatesEx),设置(LocationRequest)请求,详见获取室外高精度位置信息,根据您的需要指定定位方式,获取持续的位置信息回调。如果您获取位置信息后,想取消位置信息回调,可以调用移除位置更新方法(removeLocationUpdates),达到取消回调的目的。
为了您的应用能够更好地体验室外高精度服务,需要满足以下条件:
如上设备仅在手机版本为中国大陆版本时,支持室外高精度服务。
要使用室外高精度服务API,需要确保您的设备已经下载并安装了HMS Core(APK)服务组件,并将Location Kit的SDK集成到您的项目中。有关详细信息,请参见开发准备。以下仅为代码片段,详情请参见示例代码。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
以上室外高精度服务相关权限属于危险权限(Android 6.0及以上版本危险权限要求),使用时需要动态申请。
“Java” // 定位交互接入对象 private FusedLocationProviderClient fusedLocationProviderClient; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); }
“Kotlin” // 定位交互接入对象 private lateinit var fusedLocationProviderClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this) }
您可以通过requestLocationUpdatesEx接口向HMS Core(APK)请求室外高精度位置,位置回调的结果是在LocationCallback的onLocationResult()中。如果您想获取详细的位置信息对象,您可以在位置回调结果监听方法中通过locationResult.getLocations()或locationResult.getHWLocationList()获得到Location或者HWLocation列表。
“Java” LocationRequest mLocationRequest = new LocationRequest(); // 设置位置更新的间隔(单位:毫秒) mLocationRequest.setInterval(10000); // 设置室外高精度类型 mLocationRequest.setPriority(LocationRequest.PRIORITY_HD_ACCURACY);
“Kotlin” val mLocationRequest = LocationRequest() // 设置位置更新的间隔(单位:毫秒) mLocationRequest.interval = 10000 // 设置室外高精度类型 mLocationRequest.priority = LocationRequest.PRIORITY_HD_ACCURACY
“Java” LocationCallback mLocationCallback; mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult != null) { // 获取位置信息 List<Location> locations = locationResult.getLocations(); for (Location location : locations) { // TODO:回调结果的处理 } } } };
“Kotlin” val mLocationCallback: LocationCallback mLocationCallback = object : LocationCallback() { override fun onLocationResult(locationResult: LocationResult) { if (locationResult != null) { // 获取位置信息 val locations = locationResult.locations for (location in locations) { // TODO:回调结果的处理 } } } }
“Java” fusedLocationProviderClient .requestLocationUpdatesEx(mLocationRequest, mLocationCallback, Looper.getMainLooper()) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // 接口调用成功的处理 } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { // 接口调用失败的处理 } });
“Kotlin” fusedLocationProviderClient .requestLocationUpdatesEx(mLocationRequest, mLocationCallback, Looper.getMainLooper()) .addOnSuccessListener(OnSuccessListener<Void?> { // 接口调用成功的处理 }) .addOnFailureListener(OnFailureListener { // 接口调用失败的处理 })
“Java” // 注意:移除位置更新时,mLocationCallback必须与requestLocationUpdatesEx方法中的LocationCallback参数为同一对象。 fusedLocationProviderClient.removeLocationUpdates(mLocationCallback) // 移除位置更新成功监听回调 .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // TODO:移除位置更新成功的处理 } }) // 移除位置更新失败监听回调 .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { // TODO:移除位置更新失败的处理 } });
“Kotlin” // 注意:移除位置更新时,mLocationCallback必须与requestLocationUpdatesEx方法中的LocationCallback参数为同一对象。 fusedLocationProviderClient.removeLocationUpdates(mLocationCallback) // 移除位置更新成功监听回调 .addOnSuccessListener(OnSuccessListener<Void?> { // TODO:移除位置更新成功的处理 }) // 移除位置更新失败监听回调 .addOnFailureListener(OnFailureListener { // TODO:移除位置更新失败的处理 })