应用权限最佳做法

权限请求可以保护设备中的敏感信息,仅当需要访问敏感信息才能使应用正常运行时,才应使用权限请求。利用本文档介绍的技巧,您无需访问此类信息即可实现相同(或更好的)功能;但本文不会详细讨论权限在 Android 操作系统中的工作方式。

如需大致了解 Android 权限,请参阅权限概览。如需详细了解如何在代码中使用权限,请参阅请求应用权限

Android 6.0 及更高版本中的权限

在 Android 6.0(API 级别 23)及更高版本中,应用可以在运行时而不是在安装之前向用户请求权限。这样,应用就可以在确实需要相关服务或需要这些服务保护的数据时请求权限。尽管这不会(不一定会)改变整体应用行为,但会给敏感用户数据的处理方式带来一些变化:

增加了情境背景信息

系统会在运行时在应用的情境中,提示用户提供访问相关权限组涵盖的功能所需的权限。用户对请求权限的情境更加敏感,如果您请求的权限与应用的用途不匹配,那么更需要向用户详细解释您为什么请求此权限。您应尽可能在请求时以及万一用户拒绝请求后出现的后续对话框中解释您的请求。

为了提高权限请求被接受的可能性,请仅在用户需要特定功能时才提示。例如,仅在用户点击麦克风按钮时提示授予麦克风使用权限。用户更有可能允许符合其预期的权限请求。

在授予权限时更加灵活

用户可以在收到请求时以及在设置中拒绝单个权限请求,但是当功能因此而中断时,他们可能仍会感到惊讶。最好监控有多少用户拒绝权限请求(例如使用 Google Analytics [分析] 进行监控),以便通过重构应用避免依赖该权限,或更好地解释应用需要此权限才能正常运行的原因。您还应确保应用可以处理当用户拒绝权限请求或在设置中停用权限时产生的异常。

增加了事务负担

系统会请用户单独授予权限组的访问权限,而不是以集合的形式授予。这样,最大程度减少请求的权限数量就变得非常重要。原因在于,数量多会增加用户授予权限的负担,并且会增大至少有一个请求被拒绝的概率。

需要成为默认处理程序的权限

有些应用依赖于访问与通话记录和短信有关的敏感用户信息。如果您想请求特定于通话记录和短信的权限,并将应用发布到 Play 商店,您必须在请求这些运行时权限之前,提示用户将应用设置为核心系统功能的默认处理程序。

如需详细了解默认处理程序,包括有关如何向用户显示默认处理程序提示的指南,请参阅有关仅在默认处理程序中使用的权限的指南

了解您正在使用的库

有时,您在应用中使用的库需要权限。例如,广告和分析库可能需要访问 LOCATION 权限组才能实现必需的功能。但从用户的角度来看,权限请求来自于您的应用,而不是库。

就像用户会选择使用较少权限即可实现相同功能的应用一样,开发者也应检查他们的库,并选择不会使用非必要权限的第三方 SDK。例如,如果您使用的库提供了定位功能,请确保您不会请求 FINE_LOCATION 权限,除非您要使用基于位置的定位功能。

限制对位置信息的后台使用权

当您的应用在后台运行时,位置信息获取权限对应用的核心功能至关重要,并可以为用户带来明显的好处。

测试两种权限模型

在 Android 6.0(API 级别 23)及更高版本中,用户可以在运行时授予和撤消应用权限,而不是在安装应用时授予和撤消权限。因此,您必须在多种条件下测试应用。在 Android 6.0 之前,您可以合理地认为,如果应用能运行,它就已经获得在应用清单中声明的全部权限。现在,无论使用哪个 API 级别,用户都可以开启或关闭任何应用的权限。您应测试以确保您的应用能在各种权限情境中正常运行。

以下提示可帮助您在搭载 API 级别 23 或更高级别的设备上找出与权限有关的代码问题:

  • 确定应用的当前权限和相关的代码路径。
  • 在各种受权限保护的服务和数据中测试用户流。
  • 使用授予或撤消权限的各种组合进行测试。例如,相机应用可能会在清单中列出 CAMERAREAD_CONTACTSACCESS_FINE_LOCATION。您应在测试该应用时逐一开启和关闭这些权限,确保应用可以妥善处理所有权限配置。
  • 使用 adb 工具从命令行管理权限:
    • 按组列出权限和状态:
      $ adb shell pm list permissions -d -g
    • 授予或撤消一项或多项权限:
      $ adb shell pm [grant|revoke] <permission-name> ...
  • 针对使用权限的服务对应用进行分析。

其他资源