【问题标题】:Check dangerous permissions every time每次检查危险权限
【发布时间】:2018-11-11 16:35:37
【问题描述】:

如果您的应用需要危险权限,您必须在每次执行需要该权限的操作时检查您是否拥有该权限。

https://developer.android.com/training/permissions/requesting
(在 API 23 及以上的情况下)

意思是:

  1. 每次将要执行该操作以授予权限时,都会弹出权限对话框。
  2. 如果授予了权限,则只发送给 ContextCompat.checkSelfPermission()(以编程方式),如果是,则不会弹出权限对话框。

或者别的什么...

为什么我需要这个答案:

我有一项服务每天在后台运行多次(请求位置)不连续,比如说每天 3 次,这是否意味着运行时权限对话框必须在我的服务进行时每天显示 3 次执行它的工作 - 或者 - 它必须仅在我的服务第一次启动时显示,然后它以编程方式(仅)检查剩余的 2 次是否已授予权限? (上面相同的问题在这里改了)。

【问题讨论】:

    标签: android


    【解决方案1】:

    这是否意味着每当我的服务要执行其工作时,运行时权限对话框必须每天显示 3 次

    可能不会。

    它必须仅在我的服务第一次启动时显示,然后它以编程方式(仅)检查剩余的 2 次是否已授予权限?

    可能不会。

    文档中的引用意味着您需要在尝试执行需要运行时权限(dangerous 权限)的操作之前调用ContextCompat.checkSelfPermission()。这不会显示任何 UI。它只是让您知道您是否拥有该权限。

    如果您不持有该权限,您将在能够做任何您想做的事情之前向用户请求权限。 需要从一个活动或片段中执行,使用requestPermissions()

    在您的情况下,在您安排后台工作(WorkManagerJobScheduler 等)之前,请使用 requestPermissions(),并且仅在用户授予您所需的权限时才安排该工作。

    但是,用户可能会撤销授予的权限。这就是为什么您的后台工作需要致电checkSelfPermission()。如果这表明您没有该权限,您将需要提出 Notification 将用户引导至您的 UI,您可以在其中再次 requestPermissions()

    【讨论】:

    • 很好的详细答案正是我想要的 :) (我在 stackoverflow 中的第一个问题,它说避免用“谢谢”评论我该说什么?无论如何,谢谢@CommonsWare 的回答)
    【解决方案2】:

    这意味着您需要每次调用 checkSelfPermission,并确保用户没有删除您的权限(因为如果他们这样做了,该操作将失败,返回错误或异常)。但是,如果返回 false,则获得许可的唯一方法是显示对话框。或者你不能做你打算做的任何事情。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 2022-07-29
      • 2017-12-29
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      相关资源
      最近更新 更多