适当地使用位置信息能够为应用的用户带来好处。例如,如果应用要在用户步行或驾车时帮助他们寻路,或者如果应用要跟踪资产的位置,那么就需要定期获取设备的位置信息。除了地理位置(纬度和经度)之外,您可能还需要向用户提供其他信息,如设备的方位(水平行进方向)、高度或速度。一体化位置信息提供程序中检索这些信息。作为响应,API 会根据 WLAN 和 GPS(全球定位系统)等当前可用的位置信息提供程序,以可用的最佳位置信息定期更新应用。位置信息的准确度由提供程序、您已请求的位置权限以及您在位置信息请求中设置的选项决定。

本课将介绍如何在一体化位置信息提供程序中使用 requestLocationUpdates() 方法请求对设备的位置信息进行定期更新。

获取最近一次的已知位置

设备最近一次的已知位置提供了一个方便的起点,可确保应用在开始定期位置信息更新之前具有已知位置。获取最近一次的已知位置一课将向您介绍如何通过调用 getLastLocation() 获取最近一次的已知位置。下面几部分中的代码段假定您的应用已检索到最近一次的已知位置,并将其作为 mCurrentLocation 中。

发出位置信息请求

在请求位置信息更新之前,应用必须连接到位置信息服务并发出位置信息请求。更改位置信息设置一课将向您介绍如何执行此操作。发出位置信息请求后,即可通过调用 requestLocationUpdates() 开始定期更新。

根据请求的形式,一体化位置信息提供程序要么调用 LocationCallback.onLocationResult() 回调方法并向其传递 PendingIntent 并在其扩展数据中包含位置信息。更新的准确度和频率受您已请求的位置权限以及您在位置信息请求对象中设置的选项的影响。

本课将介绍如何使用 LocationCallback 回调方法获取更新。调用 requestLocationUpdates(),并向其传递 LocationRequest 对象的实例和 LocationCallback。定义一个 startLocationUpdates() 方法,如以下代码示例所示:

Kotlin

override fun onResume() {

super.onResume()

if (requestingLocationUpdates) startLocationUpdates()

}

private fun startLocationUpdates() {

fusedLocationClient.requestLocationUpdates(locationRequest,

locationCallback,

Looper.getMainLooper())

}Java

@Override

protected void onResume() {

super.onResume();

if (requestingLocationUpdates) {

startLocationUpdates();

}

}

private void startLocationUpdates() {

fusedLocationClient.requestLocationUpdates(locationRequest,

locationCallback,

Looper.getMainLooper());

}

请注意,上面的代码段引用了布尔标志 requestingLocationUpdates,该标志用于跟踪用户已开启还是已关闭位置信息更新。如果用户已关闭位置信息更新,您可以告知他们应用要求访问位置信息。如需详细了解如何在 Activity 实例间保留该布尔标记的值,请参阅保存 Activity 的状态。

定义位置信息更新回调

一体化位置信息提供程序会调用 LocationCallback.onLocationResult() 回调方法。传入参数包含 LocationCallback 接口并定义该方法,然后获取位置信息更新的时间戳,并在应用的界面上显示纬度、经度和时间戳:

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {

// ...

locationCallback = object : LocationCallback() {

override fun onLocationResult(locationResult: LocationResult?) {

locationResult ?: return

for (location in locationResult.locations){

// Update UI with location data

// ...

}

}

}

}Java

private LocationCallback locationCallback;

// ...

@Override

protected void onCreate(Bundle savedInstanceState) {

// ...

locationCallback = new LocationCallback() {

@Override

public void onLocationResult(LocationResult locationResult) {

if (locationResult == null) {

return;

}

for (Location location : locationResult.getLocations()) {

// Update UI with location data

// ...

}

}

};

}

停止位置信息更新

您应考虑当 Activity 不再获得焦点时(如当用户切换到另一个应用或切换到同一应用中的另一个 Activity 时)是否要停止位置信息更新。这样便于减少耗电量,前提是应用即使在后台运行时也不需要收集信息。本部分介绍如何在 Activity 的

Kotlin

override fun onPause() {

super.onPause()

stopLocationUpdates()

}

private fun stopLocationUpdates() {

fusedLocationClient.removeLocationUpdates(locationCallback)

}Java

@Override

protected void onPause() {

super.onPause();

stopLocationUpdates();

}

private void stopLocationUpdates() {

fusedLocationClient.removeLocationUpdates(locationCallback);

}

使用布尔属性 requestingLocationUpdates 跟踪当前是否开启了位置信息更新。在 Activity 的

Kotlin

override fun onResume() {

super.onResume()

if (requestingLocationUpdates) startLocationUpdates()

}Java

@Override

protected void onResume() {

super.onResume();

if (requestingLocationUpdates) {

startLocationUpdates();

}

}

保存 Activity 的状态

设备配置的更改(如屏幕方向或语言的更改)可能会导致当前 Activity 被销毁。因此,应用必须存储重新创建该 Activity 所需的所有信息。为了实现此目的,一种方法是使用存储在

以下代码示例展示了如何使用 Activity 的 onSaveInstanceState() 回调保存实例状态:

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {

outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)

super.onSaveInstanceState(outState)

}Java

@Override

protected void onSaveInstanceState(Bundle outState) {

outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,

requestingLocationUpdates);

// ...

super.onSaveInstanceState(outState);

}

定义一个 updateValuesFromBundle() 方法,以从上一个 Activity 实例恢复保存的值(如果有)。从 Activity 的

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {

// ...

updateValuesFromBundle(savedInstanceState)

}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {

savedInstanceState ?: return

// Update the value of requestingLocationUpdates from the Bundle.

if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {

requestingLocationUpdates = savedInstanceState.getBoolean(

REQUESTING_LOCATION_UPDATES_KEY)

}

// ...

// Update UI to match restored state

updateUI()

}Java

@Override

public void onCreate(Bundle savedInstanceState) {

// ...

updateValuesFromBundle(savedInstanceState);

}

private void updateValuesFromBundle(Bundle savedInstanceState) {

if (savedInstanceState == null) {

return;

}

// Update the value of requestingLocationUpdates from the Bundle.

if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {

requestingLocationUpdates = savedInstanceState.getBoolean(

REQUESTING_LOCATION_UPDATES_KEY);

}

// ...

// Update UI to match restored state

updateUI();

}

如需详细了解如何保存实例状态,请参阅 Android Activity 类参考文档。

注意:为了实现更持久的存储,您可以将用户的偏好设置存储在应用的 保存键值集。

其他资源

要了解详情,请参考以下资源:

示例

java更新 位置_请求位置信息更新  |  Android 开发者  |  Android Developers相关推荐

  1. 不会自动更新了_手机老是自动更新系统?不想频繁更新,不同手机怎么设置好?...

    手机换代快,相应的手机系统更新也很快.由于很多手机会自动更新系统,这个是很方便的.但如果我们不想更新系统,怎么关闭阻止系统更新呢?小移教你几招~ 小米 小米手机,在用的系统版本很顺手,感觉没必要频繁更 ...

  2. android java 调试工具_调试应用  |  Android 开发者  |  Android Developers

    Auto 如果您希望 Android Studio 自动为您要调试的代码选择最合适的选项,请选择此调试类型.例如,如果您的项目包含任何 C 或 C++ 代码,Android Studio 会自动使用 ...

  3. win10 minikube镜像位置_绝地求生pubg更新后出现win10下蓝屏

    最近PUBG更新后大量Win10系统网吧反馈会出现蓝屏,经过测试使用临时方案,改名此文件,或者删除,可解决蓝屏 原版steam路径: X:\Steam\steamapps\common\PUBG\Ts ...

  4. java id3v2 乱码_【图】(更新最终解决办法)解决 奔驰 U盘 音乐信息乱码问题! 一招搞定~...

    多说了,相信各位车主看图秒懂.在网络搜索和尝试各种方法之后,总结了一,原想只列出最后的解决方法,但为了避免有人和我一样突发奇想浪费时间,把其它的一些没用的简单也讲一.(最终解决方案在最后) ...

  5. asscess 一条记录更新数据_一条MySQL更新语句是怎么执行的?

    流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Serv ...

  6. 龙武2服务器在维护,龙武5.25更新维护时间_龙武5.5更新维护详情_牛游戏网

    龙武5.25日更新维护公告,相信小伙伴们也很关心更新内容,那么,让我们一起看看这次更新的内容吧! 尊敬的广大玩家朋友: 为保证玩家顺畅进行游戏,提高整体服务质量,给玩家提供更好的服务,龙武所有[公测区 ...

  7. java获取天气预报_使用java获取未来7天天气信息,可用于android

    环境:eclipsse, jdk1.6, 没有使用第三方的包,都是JDK有的. 项目结构如下: 1.获取天气预报的类 WeatherUtil.java [java] package com.siqi. ...

  8. 完美世界手游服务器维护,完美世界手游更新失败_完美世界手游更新失败解决办法_玩游戏网...

    <完美世界>手游新区什么时候开 <完美世界>手游很多玩家是进入不了老区的,或者说进入老区以后也是不占优势的,所以不少的玩家比较关心新区什么时候开,下面就让玩游戏网的小编为大家简 ...

  9. java相机开发_控制相机  |  Android 开发者  |  Android Developers

    在本课程中,我们将讨论如何使用框架 API 直接控制相机硬件. 与从已有相机应用请求照片或视频相比,直接控制设备相机所需要的代码要多得多.不过,如果您要开发专门的相机应用或者与您的应用界面完全集成的应 ...

最新文章

  1. linux x window system下载,linux的x window system
  2. Android基础--tools:context=.TestActivity作用
  3. mysql 备库 hang住_mysql主键的缺少导致备库hang住
  4. 软考-信息系统项目管理师-项目管理成熟度模型
  5. dnn5.5.1的配置
  6. JavaScript实用技巧(一)
  7. window10系统 同时安装支持 jdk 1.7和1.8环境
  8. 第五天 断点续传和下载
  9. input子系统基础之按键1——什么是input子系统?
  10. 全方位了解超宽带信号高速采集记录回放系统
  11. ik做尾巴摆动 maya_【周六幸福时刻】故事分享:小蝌蚪尾巴怎么没了
  12. 理解String不可变
  13. 【ArcGIS|空间分析】微博签到数据分析(全国大学生GIS技能大赛试题)
  14. 小米3g刷高格固件_小米路由器3G版padavan老毛子原版固件
  15. oracle语句执行过程
  16. html如何将图片作为网页背景,html文档中如何把图片作为背景
  17. js return加分号_JavaScript 语句后应该加分号么?
  18. Element properties is not closed
  19. 【数据结构】使用栈解决火车硬席(H)和软席(S)的调度问题
  20. C语言实现简单的线程池【转】

热门文章

  1. Leetcode 22.括号生成 (每日一题 20210623)
  2. 168. Excel Sheet Column Title
  3. 机器学习之数学基础(一)~maximum likelihood
  4. 深度学习核心技术精讲100篇(二十二)-深度解析数学建模核心知识之搜索与推荐模型中用户建模原理
  5. Matlab并行编程函数cellfun arrayfun
  6. 基于深度学习的交通标识别算法对比研究-TensorFlow2实现
  7. Python编程基础:第二十五节 args参数*args
  8. Docker源码分析(七):Docker Container网络 (上)
  9. Great Power, Great Responsibility: The 2018 Big Data AI Landscape
  10. java实现sql批量插入参数