Android 12 及以上授权精确位置和模糊位置

news2025/1/12 8:45:36

请求位置信息权限

为了保护用户隐私,使用位置信息服务的应用必须请求位置权限。

请求位置权限时,请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于,系统中包含与位置相关的多项权限。具体请求哪项权限以及请求相关权限的方式取决于应用用例的位置信息要求。

本页介绍了不同类型的位置信息要求,并就如何在每种情况下请求位置权限提供了指导。

位置信息访问权限的类型

每项权限都具有以下特征组合:

  • 类别:前台位置信息或后台位置信息。
  • 精确度:确切位置信息或大致位置信息。

前台位置信息

如果应用的某项功能仅分享或接收一次位置信息,或者只在特定的一段时间内分享或接收位置信息,则该功能需要前台位置信息访问权限。以下是此类情况的一些示例:

  • 在导航应用中,某项功能可让用户查询精细导航路线。
  • 在即时通讯应用中,某项功能可让用户与其他用户分享自己目前所在的位置。

如果应用的功能在下列某种情况下访问设备当前的位置信息,系统就会认为应用需要使用前台位置信息:

  • 属于应用的某个 activity 可见。
  • 应用的某个前台服务正在运行中。当有前台服务在运行时,系统会显示一条常驻通知来提醒用户注意。当应用被置于后台时(例如当用户按设备上的主屏幕按钮或关闭设备的显示屏时),其位置信息访问权限会得到保留。

    此外,建议您声明 location 的前台服务类型,如以下代码段所示。在 Android 10(API 级别 29)及更高版本中,您必须声明此前台服务类型。

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29) and higher. -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

当应用请求 ACCESS_COARSE_LOCATION 权限或 ACCESS_FINE_LOCATION 权限时(如以下代码段所示),就是在声明需要获取前台位置信息:

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

后台位置信息

如果应用中的某项功能会不断与其他用户分享位置信息或使用 Geofencing API,则该应用需要后台位置信息访问权限。以下是此类情况的几个示例:

  • 在家庭位置信息分享应用中,某项功能可让用户与家庭成员持续分享位置信息。
  • 在 IoT 应用中,某项功能可让用户配置自己的家居设备,使其在用户离家时关机并在用户回家时重新开机。

除了前台位置信息部分所述的情况之外,如果应用在任何其他情况下访问设备的当前位置信息,系统就会认为应用需要使用后台位置信息。后台位置信息精确度与前台位置信息精确度相同,具体取决于应用声明的位置信息权限。

在 Android 10(API 级别 29)及更高版本中,您必须在应用的清单中声明 ACCESS_BACKGROUND_LOCATION 权限,以便请求在运行时于后台访问位置信息。在较低版本的 Android 系统中,当应用获得前台位置信息访问权限时,也会自动获得后台位置信息访问权限。

注意:Google Play 商店设置了有关设备位置信息的位置信息政策,限制应用仅在实现核心功能所必需的情形下且在满足相关政策要求后才能请求后台位置信息访问权限。

精确度

Android 支持以下级别的位置信息精确度:

大致位置

提供设备位置的估算值。如果此位置估算值来自 LocationManagerService 或 FusedLocationProvider,则该估算值会精确到 3 平方公里(约 1.2 平方英里)以内。如果您声明了 ACCESS_COARSE_LOCATION 权限,但未声明 ACCESS_FINE_LOCATION 权限,您的应用就可以收到该精确度级别的位置信息。

确切位置

提供尽可能准确的设备位置估算值。如果位置估算值来自 LocationManagerService 或 FusedLocationProvider,则此估算值通常可以精确到 50 米(160 英尺)以内,有时甚至可以精确到几米(10 英尺)以内。如果您声明了 ACCESS_FINE_LOCATION 权限,您的应用就可以收到该精确度级别的位置信息。

如果用户授予大致位置信息权限,您的应用只能获取大致位置信息(无论它声明了哪些位置信息权限)。

当用户仅授予大致位置信息使用权时,您的应用应该仍会正常工作。如果应用中的某项功能确实需要使用 ACCESS_FINE_LOCATION 权限访问确切位置信息,您可以请求用户允许该应用获取确切位置信息。

在运行时请求位置信息访问权限

当应用中的功能需要位置信息访问权限时,请等到用户与该功能互动时再发出权限请求。本工作流遵循在上下文中请求运行时权限的最佳做法,如介绍如何请求应用权限的指南中所述。

图 1 举例说明了如何执行此过程。该应用包含一项“分享位置信息”功能,需要前台位置信息访问权限。不过,在用户选择分享位置信息按钮之前,应用不会请求位置权限。

图 1. 需要前台位置信息访问权限的位置信息分享功能。如果用户选择仅在使用该应用时允许,系统就会启用该功能。

用户只能授予大致位置信息使用权

在 Android 12(API 级别 31)或更高版本中,用户仍可以请求该应用只检索大致位置信息,即使该应用请求 ACCESS_FINE_LOCATION 运行时权限也是如此。

要处理这种可能会出现的用户行为,请勿单独请求 ACCESS_FINE_LOCATION 权限,而应在单个运行时请求中同时请求 ACCESS_FINE_LOCATION 权限和 ACCESS_COARSE_LOCATION 权限。如果您尝试仅请求 ACCESS_FINE_LOCATION,系统会在某些 Android 12 版本上忽略该请求。如果您的应用以 Android 12 或更高版本为目标平台,系统会在 Logcat 中记录以下错误消息:

ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

注意:为了更好地尊重用户隐私,建议您仅请求 ACCESS_COARSE_LOCATION。即使您只能访问大致位置信息,也可以满足大多数用例的要求。图 2 显示了您的应用以 Android 12 为目标平台且仅请求 ACCESS_COARSE_LOCATION 时显示的面向用户的对话框。

当您的应用同时请求 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 时,系统权限对话框将为用户提供以下选项:

  • 确切位置:允许您的应用获取确切位置信息。
  • 大致位置:允许您的应用仅获取大致位置信息。

图 3 显示该对话框包含两个可帮助用户进行选择的视觉提示选项。用户确定位置信息精确度后,他们可以点按三个按钮中的一个来选择权限授予的时长。

在 Android 12 和更高版本中,用户可以前往系统设置,以设置任何应用的首选位置信息精确度,而不管该应用的目标 SDK 版本是什么。即使您的应用安装在搭载 Android 11 或更低版本的设备上,用户随后又将该设备升级到 Android 12 或更高版本,也是如此。

注意:如果用户从权限对话框或在系统设置中将应用的位置信息使用权从确切位置降级到大致位置,系统会重启应用的进程。因此,遵循有关请求运行时权限的最佳实践特别重要。

图 2. 当您的应用仅请求 ACCESS_COARSE_LOCATION 时显示的系统权限对话框。

图 3. 当您的应用在单个运行时请求中同时请求 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 时显示的系统权限对话框。

用户的选择会影响权限授予

下表显示了系统根据用户在运行时权限对话框中选择的选项向您的应用授予的权限:

确切位置大致位置
仅在使用该应用时允许ACCESS_FINE_LOCATION 和
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
仅限这一次ACCESS_FINE_LOCATION 和
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
拒绝无位置权限无位置权限

如需确定系统已向您的应用授予的权限,请查看权限请求的返回值。您可以在类似于下面的代码中使用 Jetpack 库,也可以使用平台库,在这种情况下,您自行管理权限请求代码。

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean coarseLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_COARSE_LOCATION,false);
            if (fineLocationGranted != null && fineLocationGranted) {
                // Precise location access granted.
            } else if (coarseLocationGranted != null && coarseLocationGranted) {
                // Only approximate location access granted.
            } else {
                // No location access granted.
            }
        }
    );

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(new String[] {
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
});
请求升级到确切位置

您可以要求用户将应用的访问权限从大致位置升级到确切位置。但是,在让用户将应用的使用权升级到确切位置信息之前,请考虑应用的用例是否确实需要这一级别的精确度。如果您的应用需要通过蓝牙或 Wi-Fi 将某个设备与附近的设备配对,请考虑使用配套设备配对或蓝牙权限,而不是请求 ACCESS_FINE_LOCATION 权限。

如需请求用户将应用的位置信息使用权从大致位置信息升级到确切位置信息,请执行以下操作:

  1. 如有必要,请说明您的应用为何需要获取权限。
  2. 再次同时请求 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限。由于用户已允许系统向您的应用授予大致位置信息使用权,因此这次系统对话框有所不同,如图 4 和图 5 所示:

图 4. 用户之前选择了大致位置仅在使用该应用时允许(在图 3 的对话框中)。

图 5. 用户之前选择了大致位置仅限这一次(在图 3 的对话框中)。

最初仅请求在前台访问位置信息

即使应用中有多项功能需要位置信息访问权限,可能其中也只有部分功能需要后台位置信息访问权限。因此,建议应用对位置权限执行递增请求,先请求前台位置信息访问权限,再请求后台位置信息访问权限。执行递增请求可以为用户提供更大的控制权和透明度,因为他们可以更好地了解应用中的哪些功能需要后台位置信息访问权限。

注意:如果应用以 Android 11(API 级别 30)或更高版本为目标平台,系统会强制执行此最佳实践。如果您同时请求在前台访问位置信息的权限和在后台访问位置信息的权限,系统会忽略该请求,且不会向您的应用授予其中的任一权限。

图 6 显示了旨在处理递增请求的应用示例。“显示当前位置”和“推荐附近的地点”这两项功能都需要前台位置信息访问权限。不过,只有“推荐附近的地点”功能需要后台位置信息访问权限。

图 6. 这两项功能都需要位置信息访问权限,但只有“推荐附近的地点”功能需要后台位置信息访问权限。

执行递增请求的过程如下所示:

  1. 首先,应用应该引导用户留意到需要前台位置信息访问权限的功能,例如图 1 中的“分享位置信息”功能或图 2 中的“显示当前位置”功能。

    在应用有权访问前台位置信息之前,建议您停止让用户访问需要后台位置信息访问权限的功能。

  2. 稍后,等到用户探索需要后台位置信息访问权限的功能时,您可以再请求在后台访问位置信息的权限。

根据需要请求在后台访问位置信息

注意:如果应用中的某项功能从后台访问位置信息,请验证此类访问是否有必要,并考虑以其他方式获取该功能所需的信息。如需详细了解后台位置信息访问权限,请参阅在后台访问位置信息页面。

图 7. 设置页面包含一个名为始终允许的选项,用于授予后台位置信息访问权限。

权限对话框内容取决于目标 SDK 版本

在搭载 Android 10(API 级别 29)的设备上,您的应用中的某项功能请求在后台访问位置信息时,系统权限对话框包含一个名为始终允许的选项。如果用户选择此选项,您的应用中的相应功能就会获得在后台访问位置信息的权限。

但是,在 Android 11(API 级别 30)及更高版本中,系统对话框不含始终允许选项。相反,用户必须在设置页面上启用后台位置信息,如图 7 所示。

请求在后台访问位置信息的权限时,您可以遵循最佳做法,帮助用户导航到此设置页面。授予权限的过程取决于应用的目标 SDK 版本。

以 Android 11 或更高版本为目标平台的应用

如果您的应用尚未获得 ACCESS_BACKGROUND_LOCATION 权限并且 shouldShowRequestPermissionRationale() 返回 true,请向用户显示包含以下内容的指导界面:

  • 明确说明应用功能需要在后台访问位置信息的原因。
  • 用于授予后台位置信息访问权限的设置选项的用户可见标签(例如,图 7 中的始终允许)。您可以调用 getBackgroundPermissionOptionLabel() 获取此标签。此方法的返回值会根据用户设备的语言偏好设置进行本地化。
  • 供用户拒绝授予权限的选项。如果用户拒绝应用在后台访问位置信息,他们应该能够继续使用应用。

图 8. 提醒用户他们已授予应用后台位置信息使用权的通知。

以 Android 10 或更低版本为目标平台的应用

当应用中的某项功能请求后台位置信息访问权限时,用户会看到一个系统对话框。此对话框包含一个选项,可用于导航到设置页面上的应用位置权限选项。

只要您的应用已遵循有关请求位置信息权限的最佳实践,您无需做出任何更改即可支持此行为。

用户可能会影响后台位置信息的准确度

如果用户请求获取大致位置信息,用户在位置信息权限对话框中的选择也适用于后台位置信息。换言之,如果用户向您的应用授予 ACCESS_BACKGROUND_LOCATION 权限,但仅授予在前台访问大致位置信息的权限,那么您的应用在后台也只有大致位置信息的访问权限。

后台位置信息授权提醒

在 Android 10 及更高版本中,当应用中的功能在用户授予后台位置信息访问权限后首次在后台访问设备位置信息时,系统会安排向用户发送一条通知。此通知旨在提醒用户他们已允许应用始终有权访问设备位置信息。示例通知如图 8 所示。

检查应用的 SDK 依赖项中的位置信息要求

检查您的应用是否使用依赖于位置信息权限(尤其是 ACCESS_FINE_LOCATION 权限)的 SDK。请参阅 Medium 上关于了解 SDK 依赖项行为的这篇文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构:字典树(前缀树,Trie树),压缩字典树(Radix)

字典树Trie Tree 字典树也称前缀树&#xff0c;Trie树。在 Elasticsearch 的倒排索引中用的也是 Trie 树。是一种针对字符串进行维护的数据结构。 字典树是对词典的一种存储方式&#xff0c;这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径&#xff0c;…

C++算法入门练习——有向图判环

现有一个共n个顶点、m条边的有向图&#xff08;假设顶点编号为从0到n-1&#xff09;&#xff0c;如果从图中一个顶点出发&#xff0c;沿着图中的有向边前进&#xff0c;最后能回到这个顶点&#xff0c;那么就称其为图中的一个环。判断图中是否有环。 解题思路&#xff1a; 判断…

Python datetime 字符串 相互转 datetime

字符串转 datetime from datetime import datetime# 定义要转换的日期时间字符串 dt_str "2021-09-30 15:48:36"# 使用datetime.strptime()函数进行转换 dt_obj datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S") print(dt_obj)datetime 转字符串 from …

2023年11月随笔之双11成为有qian人

1. 回头看 日更坚持了334天。 学信息系统项目管理师第4版系列全部更新完成 读《图数据库实战》缓缓更...... 读《读程序员的制胜技》开更并更新完成 读《像火箭科学家一样思考&#xff1a;将不可能变为可能》开更持续更新中 11月码字68883字&#xff0c;日均码字数2296字…

2023年中国金融租赁行业研究报告

第一章 行业概况 1.1 定义 金融租赁是一种融资方式&#xff0c;其中租赁公司&#xff08;出租人&#xff09;为企业&#xff08;承租人&#xff09;购买所需设备&#xff0c;并在租赁期内由承租人使用。承租人负责支付租金&#xff0c;租赁期满后有权选择退租、续租或购买设备…

24年5月软考高项考哪些内容,考试大纲什么的?

信息系统项目管理师属于「计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试」中的高级资格考试。 也称「软考高项」&#xff0c;可以「以考代评」用来评副高级职称。 一、软考备考前期准备 信息系统项目管理师考试科目包括&#xff1a; 《综合知识》、《案例分…

java设计模式学习之【适配器模式】

文章目录 引言适配器模式简介定义与用途&#xff1a;实现方式&#xff1a;类型 使用场景优势与劣势适配器模式在Spring中的应用多媒体播放器示例代码地址 引言 在我们的日常生活中&#xff0c;适配器无处不在&#xff1a;无论是将不同国家的插头转换成本地标准&#xff0c;还是…

SSM众筹管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 众筹管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开…

map()的用法

JavaScript Array map() 方法 先说说这个方法浏览器的支持&#xff1a; 支持五大主流的浏览器&#xff0c; 特别注意&#xff1a;IE 9 以下的浏览器不支持&#xff0c;只支持IE 9以上的版本的浏览器 特别注意&#xff1a;IE 9 以下的浏览器不支持&#xff0c;只支持IE 9以上的…

设计师必看!揭秘顶级外卖平台APP背后的设计原则

在数字化和移动互联网盛行的今天&#xff0c;外卖平台APP已经成为我们生活中的重要组成部分。作为设计师&#xff0c;你是否也曾思考过如何通过设计优化用户体验&#xff0c;提升品牌形象&#xff0c;甚至直接推动业务增长&#xff1f;今天&#xff0c;我们将向你揭示顶级外卖平…

Python内置类属性__cmp__属性的使用教程

概要 Python是一种简单而强大的编程语言&#xff0c;它提供了许多内置的类和功能&#xff0c;以帮助开发人员更轻松地实现各种任务。其中一个内置类属性是__cmp__&#xff0c;它允许我们在自定义类中实现对象之间的比较操作。本文将详细介绍__cmp__属性的使用方法&#xff0c;…

DistilBERT模型训练实战

LLM似乎正在接管世界&#xff0c;但许多人仍然不真正理解他们是如何运作的。 我从事机器学习工作已有几年&#xff0c;并且对自然语言处理和最近的进展非常着迷。 尽管我阅读了大部分随附的论文&#xff0c;但训练这些模型对我来说仍然是一个谜&#xff0c;这就是为什么我决定…

CSS中的非布局样式+CSS布局 前端开发入门笔记(十一)

CSS中的非布局样式 在CSS中&#xff0c;非布局样式是指那些不会直接影响页面布局的样式。这些样式主要关注的是元素的颜色、字体、背景、边框、阴影等视觉效果。以下是一些常见的非布局CSS样式&#xff1a; 文本样式&#xff1a;包括字体&#xff08;font-family&#xff09;…

以太网PHY,MAC接口

本文主要介绍以太网的 MAC 和 PHY&#xff0c;以及之间的 MII&#xff08;Media Independent Interface &#xff0c;媒体独立接口&#xff09;和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看&#xff0c;以太网接口电路主要由MAC&#xff08;M…

GAN:WGAN-GP-带有梯度惩罚的WGAN

论文&#xff1a;https://arxiv.org/pdf/1704.00028.pdf 代码&#xff1a;GitHub - igul222/improved_wgan_training: Code for reproducing experiments in "Improved Training of Wasserstein GANs" 发表&#xff1a;2017 WGAN三部曲的终章-WGAN-GP 摘要 WGAN在…

YOLOv5全网独家首发改进:SENetv2,Squeeze-Excitation模块融合Dense Layer,效果秒杀SENet

💡💡💡本文自研创新改进:SENet v2,针对SENet主要优化点,提出新颖的多分支Dense Layer,并与Squeeze-Excitation网络模块高效融合,融合增强了网络捕获通道模式和全局知识的能力 推荐指数:五星 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/catego…

GPT市场将取代插件商店 openAI已经关闭plugins申请,全部集成到GPTs(Actions)来连接现实世界,可以与物理世界互动了。

Actions使用了plugins的许多核心思想&#xff0c;也增加了新的特性。 ChatGPT的"Actions"与"Plugins"是OpenAI在GPT模型中引入的两种不同的功能扩展机制。这两种机制的目的是增强模型的功能&#xff0c;使其能够处理更多样化的任务和请求。下面是对两者的比…

应用于智慧工厂的AI边缘计算盒子+AI算法软硬一体化方案

智慧工厂解决方案&#xff0c;传统工厂/生产管理&#xff0c;普遍存在运营粗放、效率低、应变能力差、安全隐患突出、资源不平衡等“行业症状”&#xff1b; 以英码产品为核心的智能化场景解决方案&#xff0c;可以从本质上根治这些“症状”&#xff0c;如企业可利用智能预测系…

RocketMQ Copilot 一款面向 Apache RocketMQ 的智能辅助运维系统

一、RocketMQ简介 ocketMQ是阿里巴巴研发的一款分布式消息中间件&#xff0c;后开源给Apache基金会&#xff0c;成为apache的顶级开源项目。它具有高性能、高可靠、高实时和分布式的特点。RocketMQ主要应用于解决应用耦合&#xff0c;消息分发&#xff0c;流量削锋等问题。 R…

七年 4 个阶段:滴滴可观测架构演进与实践

一分钟精华速览 在当前阶段&#xff0c;可观测性的建设并没有统一的执行路径。每家公司会根据自身的业务需求、运营模式和规模&#xff0c;形成一套独特的实践方案。为了应对业务规模的扩大和需求的变化&#xff0c;可观测团队必须持续优化和升级其架构&#xff0c;并始终保证…