如何确定是否可以在 Android 12 中请求位置权限升级?

Com*_*are 31 android android-permissions

在 Android 12 中,如果应用程序通过以下方式请求精细位置权限ACCESS_FINE_LOCATION,用户可能会选择仅授予粗略位置权限。不幸的是,并非所有 API 都可以使用粗略位置权限 \xe2\x80\x94,特别是 AFAICT,要查找已连接 WiFi 网络的 SSID,我们需要精细位置权限,而不是粗略位置权限。

\n

如果您重新请求精细位置权限,系统将要求用户升级您的访问权限,但用户可能会拒绝。因此,我们需要一种方法来优雅地确定用户授予了我们粗略位置权限,并且我们仍然有资格请求升级。

\n

这个示例项目只有一个按钮来触发requestPermissions()forACCESS_FINE_LOCATION,以及四个要报告的标签:

\n
    \n
  • 我们获得了精细定位许可吗?(checkSelfPermission()为了ACCESS_FINE_LOCATION
  • \n
  • 我们是否获得了粗略位置许可?(checkSelfPermission()为了ACCESS_COARSE_LOCATION
  • \n
  • 我们是否应该提示用户我们请求的理由,以获得良好的许可?(shouldShowRequestPermissionRationale()为了ACCESS_FINE_LOCATION
  • \n
  • 我们是否应该提示用户我们请求的理由,以获得粗略的许可?(shouldShowRequestPermissionRationale()为了ACCESS_COARSE_LOCATION
  • \n
\n

在运行 Android 12 最终测试版的 Pixel 3a XL 上全新安装后运行此命令,在执行列出的操作序列后,我得到以下结果:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
行动有精细许可吗?有粗略权限吗?提示罚款?提示粗略?
启动应用程序
使用应用程序时单击按钮并授予大致位置是的
再次单击按钮并选择“保留大致位置”是的是的
第三次单击按钮并选择“保留大致位置”是的
\n
\n

虽然这些单独都有一定意义,但问题是第二个和第四个结果是相同的:

\n
    \n
  • 我有粗略的位置访问权限
  • \n
  • 我没有被告知我需要证明理由
  • \n
\n

问题是,如果用户第四次尝试单击该按钮,我们将进入“不再询问”状态,并且不会出现权限对话框。之前所有的时间,都会出现一个权限对话框,要么最初授予权限,要么授予升级。我希望能够检测到第四次或更高版本的尝试,这样我就可以显示我自己的对话框,其中显示“抱歉,您现在需要转到“设置”并手动授予权限”。然而,除了自己跟踪请求数量之外,我不知道如何清楚地识别这种情况。

\n

所以,我的问题是:有没有一种方法,使用一些现有的权限或位置API,来确定我不再被允许重新请求ACCESS_FINE_LOCATION,并且进一步的请求将导致立即失败?特别是,答案需要能够区分该表中的第二行和第四行,因此在“用户仅授予粗略访问权限”和“用户仅授予粗略访问权限,并且您尝试升级两次,用户每次都被拒绝”。

\n

use*_*239 0

更新:

根据问题跟踪器,此问题已于 2021 年 12 月 7 日修复

标记为固定。该问题已得到解决,并将在未来的版本中提供。