应用权限最佳实践

权限请求会保护从设备获取的敏感信息,并且应仅在访问信息对于应用的功能至关重要时使用。本文档提供了一些提示,说明您可能无需访问此类信息即可实现相同(或更好的)功能;它不是关于 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> ...
  • 分析你的应用程序以查找使用权限的服务。

其他资源