文档管理中心
我的

融合定位开发

概述

Android SDK为开发者提供了一套获取设备位置信息的解决方案,主要面向有一定 Android 编程经验和了解面向对象编程的开发者。

说明

融合定位返回的位置信息默认使用WGS-84坐标系。

指定应用权限

  1. Android提供了两种位置权限: ACCESS_COARSE_LOCATION(粗略的位置权限)和ACCESS_FINE_LOCATION(精确的位置权限)。需要在“AndroidManifest.xml”文件中配置权限:

    收起
    自动换行
    深色代码主题
    复制
    1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    2. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

  2. (可选)在Android 10及以上版本中,如果您需要应用程序在后台执行时也具备持续定位能力,需要在“AndroidManifest.xml”文件中配置ACCESS_BACKGROUND_LOCATION权限:

    收起
    自动换行
    深色代码主题
    复制
    1. <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

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

    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. // Android SDK<=28 所需权限动态申请
    2. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
    3. Log.i(TAG, "android sdk <= 28 Q");
    4. if (ActivityCompat.checkSelfPermission(this,
    5. Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
    6. && ActivityCompat.checkSelfPermission(this,
    7. Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    8. String[] strings =
    9. {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
    10. ActivityCompat.requestPermissions(this, strings, 1);
    11. }
    12. } else {
    13. // Android SDK>28 所需权限动态申请,需添加“android.permission.ACCESS_BACKGROUND_LOCATION”权限
    14. if (ActivityCompat.checkSelfPermission(this,
    15. Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
    16. && ActivityCompat.checkSelfPermission(this,
    17. Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
    18. && ActivityCompat.checkSelfPermission(this,
    19. "android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {
    20. String[] strings = {android.Manifest.permission.ACCESS_FINE_LOCATION,
    21. android.Manifest.permission.ACCESS_COARSE_LOCATION,
    22. "android.permission.ACCESS_BACKGROUND_LOCATION"};
    23. ActivityCompat.requestPermissions(this, strings, 2);
    24. }
    25. }
    收起
    自动换行
    深色代码主题
    复制
    1. // Android SDK<=28 所需权限动态申请
    2. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
    3. Log.i(TAG, "android sdk <= 28 Q")
    4. if (ActivityCompat.checkSelfPermission(
    5. this,
    6. Manifest.permission.ACCESS_FINE_LOCATION
    7. ) != PackageManager.PERMISSION_GRANTED
    8. && ActivityCompat.checkSelfPermission(
    9. this,
    10. Manifest.permission.ACCESS_COARSE_LOCATION
    11. ) != PackageManager.PERMISSION_GRANTED
    12. ) {
    13. val strings = arrayOf(
    14. Manifest.permission.ACCESS_FINE_LOCATION,
    15. Manifest.permission.ACCESS_COARSE_LOCATION
    16. )
    17. ActivityCompat.requestPermissions(this, strings, 1)
    18. }
    19. } else {
    20. // Android SDK > 28 所需权限动态申请,需添加“android.permission.ACCESS_BACKGROUND_LOCATION”权限。
    21. if (ActivityCompat.checkSelfPermission(
    22. this,
    23. Manifest.permission.ACCESS_FINE_LOCATION
    24. ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
    25. this,
    26. Manifest.permission.ACCESS_COARSE_LOCATION
    27. ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
    28. this,
    29. "android.permission.ACCESS_BACKGROUND_LOCATION"
    30. ) != PackageManager.PERMISSION_GRANTED
    31. ) {
    32. val strings = arrayOf(
    33. Manifest.permission.ACCESS_FINE_LOCATION,
    34. Manifest.permission.ACCESS_COARSE_LOCATION,
    35. "android.permission.ACCESS_BACKGROUND_LOCATION"
    36. )
    37. ActivityCompat.requestPermissions(this, strings, 2)
    38. }
    39. }

说明
  • ACCESS_COARSE_LOCATION:粗略的位置权限,提供城市街区级别的位置信息精准度。
  • ACCESS_FINE_LOCATION:精确的位置权限,提供的位置信息比请求ACCESS_COARSE_LOCATION时所提供的位置信息更精准。
  • ACCESS_BACKGROUND_LOCATION:后台运行权限,在Android 10(API级别29)版本此权限为危险权限需要动态申请。在Android 10之前已授予ACCESS_COARSE_LOCATION权限的应用程序在前后台都可访问位置,在Android 10及更高版本中如需在后台访问位置权限,则需要申请ACCESS_BACKGROUND_LOCATION权限。
  • 在Android 11(API 级别30)及以上,以上三个权限不能同时动态申请,需先授予ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限后再申请ACCESS_BACKGROUND_LOCATION权限。

检查设备定位开关状态

定位设置状态会直接影响定位服务的定位结果,例如位置开关处于关闭状态时,将无法获取到位置信息。因此,建议您在持续获取位置信息之前,检查设备定位开关状态。

  1. 调用getSettingsClient()接口获取SettingsClient实例。

    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. SettingsClient
      settingsClient
      = LocationServices.getSettingsClient(this);
    收起
    自动换行
    深色代码主题
    复制
    1. var
      settingsClient
      = LocationServices.getSettingsClient(this)

  2. 调用checkLocationSettings()检查设备开关设置。

    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. LocationSettingsRequest.Builder
      builder
      = new LocationSettingsRequest.Builder();
    2. LocationRequest
      mLocationRequest
      = new LocationRequest();
    3. builder
      .addLocationRequest(
      mLocationRequest
      );
    4. LocationSettingsRequest
      locationSettingsRequest
      =
      builder
      .build();
    5. // 检查设备定位设置
    6. settingsClient
      .checkLocationSettings(
      locationSettingsRequest
      )
    7. // 检查设备定位设置接口调用成功监听
    8. .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
    9. @Override
    10. public void onSuccess(LocationSettingsResponse
      locationSettingsResponse
      ) {
    11. LocationSettingsStates
      locationSettingsStates
      =
    12. locationSettingsResponse
      .getLocationSettingsStates();
    13. StringBuilder
      stringBuilder
      = new StringBuilder();
    14. // 定位开关是否打开
    15. stringBuilder
      .append(",\nisLocationUsable=")
    16. .append(
      locationSettingsStates
      .isLocationUsable());
    17. // HMS Core是否可用
    18. stringBuilder
      .append(",\nisHMSLocationUsable=")
    19. .append(
      locationSettingsStates
      .isHMSLocationUsable());
    20. Log.i(TAG, "checkLocationSetting onComplete:" +
      stringBuilder
      .toString());
    21. }
    22. })
    23. // 检查设备定位设置接口失败监听回调
    24. .addOnFailureListener(new OnFailureListener() {
    25. @Override
    26. public void onFailure(Exception e) {
    27. Log.i(TAG, "checkLocationSetting onFailure:" + e.getMessage());
    28. }
    29. });
    收起
    自动换行
    深色代码主题
    复制
    1. val
      builder
      = LocationSettingsRequest.Builder()
    2. var
      mLocationRequest
      = LocationRequest()
    3. builder
      .addLocationRequest(
      mLocationRequest
      )
    4. val
      locationSettingsRequest
      =
      builder
      .build()
    5. // 检查设备定位设置
    6. settingsClient
      .checkLocationSettings(
      locationSettingsRequest
      )
    7. // 检查设备定位设置接口调用成功监听
    8. .addOnSuccessListener(OnSuccessListener { locationSettingsResponse ->
    9. val
      locationSettingsStates
      = locationSettingsResponse.locationSettingsStates
    10. val
      stringBuilder
      = StringBuilder()
    11. // 定位开关是否打开
    12. stringBuilder
      .append("isLocationUsable=")
    13. .append(locationSettingsStates.isLocationUsable)
    14. // HMS Core是否可用
    15. stringBuilder
      .append(",\nisHMSLocationUsable=")
    16. .append(locationSettingsStates.isHMSLocationUsable)
    17. Log.i(TAG, "checkLocationSetting onComplete:$
      stringBuilder
      ")
    18. })
    19. // 检查设备定位设置接口失败监听回调
    20. .addOnFailureListener(OnFailureListener { e ->
    21. Log.i(TAG, "checkLocationSetting onFailure:" + e.message)
    22. })

说明

在非华为手机上仅返回定位开关状态,开发者可以依据返回状态,提示用户打开开关;在华为设备上,可以拉起位置开关弹窗,方便用户快速打开定位开关。

初始化定位

请在主线程中声明FusedLocationProviderClient类对象,传入Context或Activity类型参数。

Java
Kotlin
收起
自动换行
深色代码主题
复制
  1. // 声明
    fusedLocationProviderClient
    对象
  2. private FusedLocationProviderClient
    fusedLocationProviderClient
    ;
  3. // 实例化
    fusedLocationProviderClient
    对象
  4. fusedLocationProviderClient
    = LocationServices.getFusedLocationProviderClient(this);
收起
自动换行
深色代码主题
复制
  1. // 定位交互接入对象
  2. private lateinit var
    fusedLocationProviderClient
    : FusedLocationProviderClient
  3. // 实例化
    fusedLocationProviderClient
    对象
  4. fusedLocationProviderClient
    = LocationServices.getFusedLocationProviderClient(this)

选择定位模式

Location SDK提供了单次定位、持续定位、后台定位能力,开发者可以根据自己的应用场景选择合适的定位模式。不同定位模式设置方式如下:

单次定位

Java
Kotlin
收起
自动换行
深色代码主题
复制
  1. LocationRequest
    mLocationRequest
    = new LocationRequest();
  2. // 设置定位类型
  3. mLocationRequest
    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
  4. // 设置回调次数为1
  5. mLocationRequest
    .setNumUpdates(1);
收起
自动换行
深色代码主题
复制
  1. val
    mLocationRequest
    = LocationRequest()
  2. // 设置定位类型
  3. mLocationRequest
    .priority = LocationRequest.PRIORITY_HIGH_ACCURACY
  4. // 设置回调次数为1
  5. mLocationRequest
    .numUpdates = 1

持续定位

Java
Kotlin
收起
自动换行
深色代码主题
复制
  1. LocationRequest
    mLocationRequest
    = new LocationRequest();
  2. // 设置位置更新的间隔(单位:毫秒)
  3. mLocationRequest
    .setInterval(
    10000
    );
  4. // 设置定位类型
  5. mLocationRequest
    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
收起
自动换行
深色代码主题
复制
  1. val
    mLocationRequest
    = LocationRequest()
  2. // 设置位置更新的间隔(单位:毫秒)
  3. mLocationRequest
    .interval =
    10000
  4. // 设置定位类型
  5. mLocationRequest
    .priority = LocationRequest.PRIORITY_HIGH_ACCURACY
表1 LocationRequest核心方法解析
展开

方法名

参数说明

返回值说明

方法效果

默认值

setPriority(int priority)

如果请求GNSS位置,则值为100;如请求网络位置,则值为102或104;如不需要主动请求位置,仅需被动接收位置,则值为105。如果请求高精度位置信息,则值为200。

LocationRequest对象

设置定位类型。

PRIORITY_BALANCED_POWER_ACCURACY

setInterval(long millis)

假如值为50000,则位置请求每隔50秒回调一次结果。

LocationRequest对象

设置请求位置回调的时间间隔。

3600000

setNumUpdates(int numUpdates)

假如值为3时,则只回调3次结果给客户端。

LocationRequest对象

设置请求位置的回调次数。

Integer.MAX_VALUE

setFastestInterval(long millis)

如果有其他应用发起位置请求,满足fastestInterval周期后,同样会上报位置。

LocationRequest对象

设置请求位置回调的最快时间间隔。

600000

isFastestIntervalExplicitlySet()

null

boolean

是否使用最快时间间隔。

如果使用最快时间间隔,则返回true,否则返回false。

setExpirationTime(long millis)

假如200秒后位置回调需要停止,则该参数值应为SystemClock.elapsedRealtime() + 200000。

LocationRequest对象

设置请求到期时间。

Long.MAX_VALUE

setExpirationDuration(long millis)

该参数与expirationTime的区别为,该参数不需要考虑开机启动时间。假如200秒后位置回调需要停止,则该参数值应为200000。

LocationRequest对象

设置请求到期时间段。

Long.MAX_VALUE

setSmallestDisplacement(float smallestDisplacement)

两次回调位置之间的距离满足该参数的值,则进行位置回调。

LocationRequest对象

设置位置更新的最小位移。

0

setMaxWaitTime(long millis)

单位:毫秒。

生效时,位置更新会以maxWaitTime的时间为更新周期,在满足位置更新时间后,会将周期内的位置一次性返回给应用。

LocationRequest对象

设置设置位置更新的最长等待时间。

0

setNeedAddress(boolean needAddress)

needAddress为布尔型,true需要返回地址信息,false不需要。

LocationRequest对象

设置是否需要返回地址信息。

false

setLanguage(String language)

格式为:两个字母(例如:en表示英文)。使用ISO 639-1国际标准,默认为空。当前仅支持en和zh。

LocationRequest对象

设置语言。

默认为空。

setCountryCode(String countryCode)

格式为:两个字母,使用ISO 3166-1国际标准,默认为空。当前仅支持EN和CN。

LocationRequest对象

设置国家。

默认为空。

后台定位

  1. 在“AndroidManifest.xml”中添加注册后台定位权限的服务。

    收起
    自动换行
    深色代码主题
    复制
    1. <service
    2. android:name="com.huawei.location.service.BackGroundService"
    3. android:foregroundServiceType="location" />

  2. (可选)在Android 9及以上版本中,为保证后台定位权限的正常使用,需要在“AndroidManifest.xml”文件中配置FOREGROUND_SERVICE权限:

    收起
    自动换行
    深色代码主题
    复制
    1. <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

  3. 调用enableBackgroundLocation()方法,传入服务通知开启后台定位能力。

    说明
    • Location kit 6.0.0版本新增方法,仅HMS Core非预装场景时支持使用,用于部分厂商或机型在持续定位的过程中,应用进入后台或者息屏场景下,因系统省电策略导致停止位置回调,开启后台定位后,该场景下仍能持续提供定位能力。
    • 上述代码的具体实现部分请参考示例代码仓中的内容
    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. Notification.Builder
      builder
      ;
    2. Notification
      mNotification
      ;
    3. int
      notificationId
      =
      1
      ;
    4. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    5. NotificationManager
      notificationManager
      =
    6. (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
    7. String
      channelId
      = context.getPackageName();
    8. NotificationChannel
      notificationChannel
      =
    9. new NotificationChannel(
      channelId
      , "LOCATION", NotificationManager.IMPORTANCE_LOW);
    10. notificationManager
      .createNotificationChannel(
      notificationChannel
      );
    11. builder
      = new Notification.Builder(context,
      channelId
      );
    12. } else {
    13. builder
      = new Notification.Builder(context);
    14. }
    15. if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    16. mNotification
      = builder.build();
    17. } else {
    18. mNotification
      = builder.getNotification();
    19. }
    20. fusedLocationProviderClient
      .enableBackgroundLocation(
      notificationId
      ,
      mNotification
      );
    收起
    自动换行
    深色代码主题
    复制
    1. val
      builder
      : Notification.Builder
    2. val
      mNotification
      : Notification
    3. var
      notificationId
      =
      1
    4. builder
      = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    5. val
      notificationManager
      =
    6. context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    7. val
      channelId
      = context.packageName
    8. val
      notificationChannel
      =
    9. NotificationChannel(
      channelId
      , "LOCATION", NotificationManager.IMPORTANCE_LOW)
    10. notificationManager
      .createNotificationChannel(
      notificationChannel
      )
    11. Notification.Builder(context,
      channelId
      )
    12. } else {
    13. Notification.Builder(context)
    14. }
    15. mNotification
      = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    16. builder
      .build()
    17. } else {
    18. builder
      .notification
    19. }
    20. fusedLocationProviderClient
      .enableBackgroundLocation(
      notificationId
      ,
      mNotification
      )

启动定位

  1. 定义位置更新回调。

    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. LocationCallback
      mLocationCallback
      ;
    2. mLocationCallback
      = new LocationCallback() {
    3. @Override
    4. public void onLocationResult(LocationResult
      locationResult
      ) {
    5. if (
      locationResult
      != null) {
    6. // TODO: 处理位置回调结果
    7. }
    8. }
    9. };
    收起
    自动换行
    深色代码主题
    复制
    1. val
      mLocationCallback
      : LocationCallback
    2. mLocationCallback
      = object : LocationCallback() {
    3. override fun onLocationResult(
      locationResult
      : LocationResult) {
    4. if (
      locationResult
      != null) {
    5. // TODO: 处理位置回调结果
    6. }
    7. }
    8. }

  2. 调用requestLocationUpdates()进行定位。

    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. fusedLocationProviderClient
      .requestLocationUpdates(
      mLocationRequest
      ,
      mLocationCallback
      , Looper.getMainLooper())
    2. .addOnSuccessListener(new OnSuccessListener<Void>() {
    3. @Override
    4. public void onSuccess(Void
      aVoid
      ) {
    5. // TODO: 接口调用成功的处理
    6. }
    7. })
    8. .addOnFailureListener(new OnFailureListener() {
    9. @Override
    10. public void onFailure(Exception e) {
    11. // TODO: 接口调用失败的处理
    12. }
    13. });
    收起
    自动换行
    深色代码主题
    复制
    1. fusedLocationProviderClient
      .requestLocationUpdates(
      mLocationRequest
      ,
      mLocationCallback
      , Looper.getMainLooper())
    2. .addOnSuccessListener {
    3. // TODO: 接口调用成功的处理
    4. }
    5. .addOnFailureListener {
    6. // TODO: 接口调用失败的处理
    7. }
    说明

停止定位

(可选)当您的定位模式为后台定位时,需要先将后台定位能力关闭。
Java
Kotlin
收起
自动换行
深色代码主题
复制
  1. fusedLocationProviderClient
    .disableBackgroundLocation();
收起
自动换行
深色代码主题
复制
  1. fusedLocationProviderClient
    .disableBackgroundLocation()
调用removeLocationUpdates()停止位置更新。
Java
Kotlin
收起
自动换行
深色代码主题
复制
  1. // 注意:停止位置更新时,
    mLocationCallback
    必须与requestLocationUpdates方法中的LocationCallback参数为同一对象。
  2. fusedLocationProviderClient
    .removeLocationUpdates(
    mLocationCallback
    )
  3. // 停止位置更新成功监听回调
  4. .addOnSuccessListener(new OnSuccessListener<Void>() {
  5. @Override
  6. public void onSuccess(Void
    aVoid
    ) {
  7. // TODO: 停止位置更新成功的处理
  8. }
  9. })
  10. // 停止位置更新失败监听回调
  11. .addOnFailureListener(new OnFailureListener() {
  12. @Override
  13. public void onFailure(Exception e) {
  14. // TODO:停止位置更新失败的处理
  15. }
  16. });
收起
自动换行
深色代码主题
复制
  1. // 注意:停止位置更新时,
    mLocationCallback
    必须与requestLocationUpdates方法中的LocationCallback参数为同一对象。
  2. fusedLocationProviderClient
    .removeLocationUpdates(
    mLocationCallback
    )
  3. // 停止位置更新成功监听回调
  4. .addOnSuccessListener {
  5. // TODO:停止位置更新成功的处理
  6. }
  7. // 停止位置更新失败监听回调
  8. .addOnFailureListener {
  9. // TODO:停止位置更新失败的处理
  10. }

获取最后的已知位置

您的应用可以调用getLastLocation()方法获取设备最后的已知位置,大多情况下,该位置即为设备的当前位置。代码样例如下:
Java
Kotlin
收起
自动换行
深色代码主题
复制
  1. // 获取最后的已知位置
  2. Task<Location>
    task
    =
    fusedLocationProviderClient
    .getLastLocation()
  3. // 获取最后的已知位置成功监听回调
  4. .addOnSuccessListener(new OnSuccessListener<Location>() {
  5. @Override
  6. public void onSuccess(Location
    location
    ) {
  7. if (
    location
    == null) {
  8. return;
  9. }
  10. // TODO:成功时Location对象处理逻辑
  11. }
  12. })
  13. // 获取最后的已知位置失败监听回调
  14. .addOnFailureListener(new OnFailureListener() {
  15. @Override
  16. public void onFailure(Exception e) {
  17. // TODO:接口调用失败处理
  18. }
  19. });
收起
自动换行
深色代码主题
复制
  1. val
    lastLocation
    =
  2. fusedLocationProviderClient
    .lastLocation
  3. lastLocation
    .addOnSuccessListener(OnSuccessListener { location ->
  4. if (location == null) {
  5. return@OnSuccessListener
  6. }
  7. // TODO:成功时Location对象处理逻辑
  8. return@OnSuccessListener
  9. })
  10. // 获取最后的已知位置失败监听回调
  11. .addOnFailureListener {
  12. // TODO:接口调用失败处理
  13. }
说明

getLastLocation()方法是从系统缓存中获取位置信息的。如果获取的位置信息为null,则可能是系统缓存已经被清除;此时先调用requestLocationUpdates()方法获取位置信息以刷新缓存,再调用getLastLocation()方法即可以获取到位置信息。

使用模拟位置信息功能

具体操作:打开“设置 > 系统和更新 > 开发人员选项 > 选择模拟位置信息应用 > 选择要模拟位置信息应用”(如果没有发现“开发人员选项”,请执行如下操作:“设置 > 关于手机 > 版本号”,连续点击“版本号”7次,“开发人员选项”会出现在“系统与更新”页面,再重复上述操作),代码开发步骤如下:

  1. 在AndroidManifest.xml文件中配置模拟定位权限。

    收起
    自动换行
    深色代码主题
    复制
    1. <uses-permission
    2. android:name="android.permission.ACCESS_MOCK_LOCATION"
    3. tools:ignore="MockLocation,ProtectedPermissions" />

  2. 设置mock模式,调用setMockMode(boolean isMockMode)。

    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. // 设置mock模式,参数传入ture:模拟模式;false:正常状态
    2. boolean
      mockFlag
      = true;
    3. fusedLocationProviderClient
      .setMockMode(
      mockFlag
      ).addOnSuccessListener(new OnSuccessListener<Void>() {
    4. @Override
    5. public void onSuccess(Void
      aVoid
      ) {
    6. Log.i(TAG, "setMockMode onSuccess");
    7. }
    8. }).addOnFailureListener(new OnFailureListener() {
    9. @Override
    10. public void onFailure(Exception e) {
    11. Log.i(TAG, "setMockMode onFailure:" + e.getMessage());
    12. }
    13. });
    收起
    自动换行
    深色代码主题
    复制
    1. // 设置mock模式,参数传入ture:模拟模式;false:正常状态
    2. val
      mockFlag
      = true
    3. fusedLocationProviderClient
      .setMockMode(
      mockFlag
      )
    4. .addOnSuccessListener { Log.i(TAG, "setMockMode onSuccess") }
    5. .addOnFailureListener { e ->
    6. Log.i(TAG,"setMockMode onFailure:" + e.message)
    7. }

  3. 设置模拟位置信息,调用setMockLocation(Location mockLocation)。

    Java
    Kotlin
    收起
    自动换行
    深色代码主题
    复制
    1. // 设置模拟位置信息
    2. final Location
      mockLocation
      = new Location(LocationManager.GPS_PROVIDER);
    3. mockLocation
      .setLongitude(
      118.76
      );
    4. mockLocation
      .setLatitude(
      31.98
      );
    5. fusedLocationProviderClient
      .setMockLocation(
      mockLocation
      )
    6. // 设置模拟位置信息成功监听回调
    7. .addOnSuccessListener(new OnSuccessListener<Void>() {
    8. @Override
    9. public void onSuccess(Void
      aVoid
      ) {
    10. Log.i(TAG, "setMockLocation onSuccess");
    11. }
    12. })
    13. // 设置模拟位置信息失败监听回调
    14. .addOnFailureListener(new OnFailureListener() {
    15. @Override
    16. public void onFailure(Exception e) {
    17. Log.i(TAG, "setMockLocation onFailure:" + e.getMessage());
    18. }
    19. });
    收起
    自动换行
    深色代码主题
    复制
    1. // 设置模拟位置信息
    2. val
      mockLocation
      = Location(LocationManager.GPS_PROVIDER)
    3. mockLocation
      .longitude =
      118.76
    4. mockLocation
      .latitude = 31.98
    5. fusedLocationProviderClient
      .setMockLocation(
      mockLocation
      )
    6. // 设置模拟位置信息成功监听回调
    7. .addOnSuccessListener {
    8. Log.i(
    9. TAG,
    10. "setMockLocation onSuccess"
    11. )
    12. }
    13. // 设置模拟位置信息失败监听回调
    14. .addOnFailureListener { e ->
    15. Log.i(
    16. TAG,
    17. "setMockLocation onFailure:" + e.message
    18. )
    19. }