目录

室外高精度开发

  1. 使用室外高精度能力的开发者需要遵守国家法律法规与华为公司共同向国家有关部门申请高精度偏转插件的使用许可。
  2. 室外高精度能力当前仅支持中国大陆地区的部分城市:深圳市、广州市、苏州市、杭州市、重庆市、成都市、天津市、东莞市(持续增加中),海外暂不支持。

概述

如果您的应用需要请求更高精度的(亚米级的)位置信息,首先您需要为应用申请位置权限,然后调用请求位置更新方法(requestLocationUpdatesEx),设置(LocationRequest)请求,详见获取室外高精度位置信息,根据您的需要指定定位方式,获取持续的位置信息回调。如果您获取位置信息后,想取消位置信息回调,可以调用移除位置更新方法(removeLocationUpdates),达到取消回调的目的。

约束条件

为了您的应用能够更好地体验室外高精度服务,需要满足以下条件:

要使用室外高精度服务API,需要确保您的设备已经下载并安装了HMS Core(APK)服务组件,并将Location Kit的SDK集成到您的项目中。有关详细信息,请参见开发准备。以下仅为代码片段,详情请参见示例代码。

指定应用权限

  1. Android提供了两种位置权限: ACCESS_COARSE_LOCATION(粗略的位置权限)和ACCESS_FINE_LOCATION(精确的位置权限)。需要在“AndroidManifest.xml”文件中申请权限:
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  2. (可选)在Android 10及以上版本中,如果您需要应用程序在后台执行时也具备持续定位能力,还需要在“AndroidManifest.xml”文件中申请ACCESS_BACKGROUND_LOCATION权限:
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

    以上室外高精度服务相关权限属于危险权限(Android 6.0及以上版本危险权限要求),使用时需要动态申请。

创建定位服务客户端

在您的项目中使用到定位服务的Activity中的onCreate()方法中创建一个FusedLocationProviderClient实例,通过该实例调用定位相关接口。
“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列表。

  1. 设置室外高精度请求参数。
    构建LocationRequest请求,仅当字段“priority”设置为“LocationRequest.PRIORITY_HD_ACCURACY”时才能发起室外高精度请求。
    “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
  2. 定义位置更新回调。
    “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:回调结果的处理
                }
            }
        }
    }
  3. 调用requestLocationUpdatesEx()进行室外高精度。
    “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 {
            // 接口调用失败的处理
        })
  4. (可选)调用removeLocationUpdates()移除室外高精度请求。
    “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:移除位置更新失败的处理
        })