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

守听  金牌会员 | 2024-6-11 10:25:25 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

哀求位置信息权限

为了掩护用户隐私,使用位置信息服务的应用必须哀求位置权限。
哀求位置权限时,请遵循与哀求任何其他运行时权限相同的最佳做法。哀求位置权限时的一个重要区别在于,系统中包含与位置相干的多项权限。具体哀求哪项权限以及哀求相干权限的方式取决于应用用例的位置信息要求。
本页介绍了不同范例的位置信息要求,并就如安在每种情况下哀求位置权限提供了指导。
位置信息访问权限的范例

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


  • 种别:前台位置信息或背景位置信息。
  • 准确度:确切位置信息或大抵位置信息。
前台位置信息

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


  • 在导航应用中,某项功能可让用户查询精细导航路线。
  • 在即时通讯应用中,某项功能可让用户与其他用户分享自己目前所在的位置。
如果应用的功能在下列某种情况下访问设备当前的位置信息,系统就会认为应用需要使用前台位置信息:


  • 属于应用的某个 activity 可见。
  • 应用的某个前台服务正在运行中。当有前台服务在运行时,系统会表现一条常驻通知来提示用户注意。当应用被置于背景时(例如当用户按设备上的主屏幕按钮或关闭设备的表现屏时),其位置信息访问权限会得到保存。
    此外,发起您声明 location 的前台服务范例,如以下代码段所示。在 Android 10(API 级别 29)及更高版本中,您必须声明此前台服务范例。
          
    1. <!-- Recommended for Android 9 (API level 28) and lower. -->
    2. <!-- Required for Android 10 (API level 29) and higher. -->
    3. <service
    4.     android:name="MyNavigationService"
    5.     <strong>android:foregroundServiceType="location"</strong> ... >
    6.     <!-- Any inner elements would go here. -->
    7. </service>
    复制代码
当应用哀求 ACCESS_COARSE_LOCATION 权限或 ACCESS_FINE_LOCATION 权限时(如以下代码段所示),就是在声明需要获取前台位置信息:
  
  1. <manifest ... >
  2.   <!-- Always include this permission -->
  3.   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  4.   <!-- Include only if your app benefits from precise location access. -->
  5.   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  6. </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 中记载以下错误消息:
  
  1. 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_LOCATIONACCESS_COARSE_LOCATION仅限这一次ACCESS_FINE_LOCATION 和
ACCESS_COARSE_LOCATIONACCESS_COARSE_LOCATION拒绝无位置权限无位置权限 如需确定系统已向您的应用授予的权限,请查看权限哀求的返回值。您可以在类似于下面的代码中使用 Jetpack 库,也可以使用平台库,在这种情况下,您自行管理权限哀求代码。
Java
  
  1. ActivityResultLauncher<String[]> locationPermissionRequest =
  2.     registerForActivityResult(new ActivityResultContracts
  3.         .RequestMultiplePermissions(), result -> {
  4.             Boolean fineLocationGranted = result.getOrDefault(
  5.                     Manifest.permission.ACCESS_FINE_LOCATION, false);
  6.             Boolean coarseLocationGranted = result.getOrDefault(
  7.                     Manifest.permission.ACCESS_COARSE_LOCATION,false);
  8.             if (fineLocationGranted != null && fineLocationGranted) {
  9.                 // Precise location access granted.
  10.             } else if (coarseLocationGranted != null && coarseLocationGranted) {
  11.                 // Only approximate location access granted.
  12.             } else {
  13.                 // No location access granted.
  14.             }
  15.         }
  16.     );
  17. // ...
  18. // Before you perform the actual permission request, check whether your app
  19. // already has the permissions, and whether your app needs to show a permission
  20. // rationale dialog. For more details, see Request permissions.
  21. locationPermissionRequest.launch(new String[] {
  22.     Manifest.permission.ACCESS_FINE_LOCATION,
  23.     Manifest.permission.ACCESS_COARSE_LOCATION
  24. });
复制代码
哀求升级到确切位置

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

  • 如有须要,请阐明您的应用为何需要获取权限。
  • 再次同时哀求 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限。由于用户已答应系统向您的应用授予大抵位置信息使用权,因此这次系统对话框有所不同,如图 4 和图 5 所示:

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

图 5. 用户之前选择了大抵位置仅限这一次(在图 3 的对话框中)。
最初仅哀求在前台访问位置信息

即使应用中有多项功能需要位置信息访问权限,可能此中也只有部分功能需要背景位置信息访问权限。因此,发起应用对位置权限实行递增哀求,先哀求前台位置信息访问权限,再哀求背景位置信息访问权限。实行递增哀求可以为用户提供更大的控制权和透明度,由于他们可以更好地了解应用中的哪些功能需要背景位置信息访问权限。
   注意:如果应用以 Android 11(API 级别 30)或更高版本为目标平台,系统会强制实行此最佳实践。如果您同时哀求在前台访问位置信息的权限和在背景访问位置信息的权限,系统会忽略该哀求,且不会向您的应用授予此中的任一权限。
  图 6 表现了旨在处理递增哀求的应用示例。“表现当前位置”和“推荐附近的地点”这两项功能都需要前台位置信息访问权限。不过,只有“推荐附近的地点”功能需要背景位置信息访问权限。

图 6. 这两项功能都需要位置信息访问权限,但只有“推荐附近的地点”功能需要背景位置信息访问权限。
实行递增哀求的过程如下所示:

  • 起首,应用应该引导用户留意到需要前台位置信息访问权限的功能,例如图 1 中的“分享位置信息”功能或图 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 依赖项举动的这篇文章。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表