> For the complete documentation index, see [llms.txt](https://jiek.gitbook.io/android-permission/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jiek.gitbook.io/android-permission/quan-xian-shi-yong-bi-ji.md).

# 权限使用注意事项

权限使用注意事项

一个应用程序很容易淹没拥有权限请求的用户。如果用户发现应用程序令人沮丧，或者用户担心应用程序可能在使用该用户的信息，可能会避免使用该应用程序或将其完全卸载。以下最佳做法可以帮助您避免这样糟糕的用户体验。

## 考虑使用意图

在许多情况下，您可以通过两种方式为应用程序执行任务。您可以让您的应用程序请求执行操作本身的权限。或者，你可以有应用程序使用意图有另一个应用程序执行的任务。

例如，假设您的应用程序需要能够使用设备摄像头拍照。您的应用程序可以请求CAMERA许可，允许您的应用直接访问相机。然后，您的应用程序将使用相机API来控制相机并拍摄照片。这种方法可以让您的应用程序完全控制摄影过程，并且可以将摄像头UI整合到应用程序中。

但是，如果您不需要这样的完全控制，您可以使用ACTION\_IMAGE\_CAPTURE意图来请求图像。当您发送意图时，系统提示用户选择相机应用程序（如果还没有默认的相机应用程序）。用户使用所选的相机应用程序拍摄照片，该应用程序会将照片返回到应用程序的**onActivityResult()**&#x65B9;法。

同样，如果您需要打电话，访问用户的联系人等等，您可以通过创建适当的意图来做到这一点，或者您可以请求权限并直接访问相应的对象。每种方法都有优缺点。

### 如果您使用权限：

* 执行操作时，您的应用程序可以完全控制用户体验。但是，由于您需要设计合适的UI，因此广泛的控制会增加您的任务的复杂性。
* 系统会提示用户在运行时或安装时给予权限（具体取决于用户的Android版本）。之后，您的应用程序可以执行操作，而不需要用户的额外交互。但是，如果用户未授予权限（或稍后撤销），则您的应用程序将无法完成该操作。

### 如果您使用意图：

* 您不必为操作设计UI。处理意图的应用程序提供了UI。但是，这意味着您无法控制用户体验。用户可以与您从未见过的应用互动。
* 如果用户没有该操作的默认应用程序，系统会提示用户选择一个应用程序。如果用户没有指定默认处理程序，则每次执行操作时可能需要经过一个额外的对话框。

## 只需要你需要的权限

每次您要求许可时，强制用户作出决定。您应该尽量减少进行这些请求的次数。如果用户运行Android 6.0（API级别23）或更高版本，每次用户尝试一些需要许可的新应用程序功能时，应用程序必须通过权限请求中断用户的工作。如果用户正在运行较早版本的Android，则用户必须在安装应用时授予每个应用的权限; 如果列表太长或看起来不合适，用户可能会决定不安装您的应用程序。由于这些原因，您应该最小化您的应用程序所需的权限数量。

您的应用程序通常可以避免通过使用意图来请求许可 。如果功能不是应用功能的核心部分，那么您应该考虑将工作交给另一个应用程序，如“ [使用意图](https://developer.android.com/training/permissions/usage-notes.html#perms-vs-intents)”一节中所述。

## 不要压倒用户

如果用户正在运行Android 6.0（API级别23）或更高版本，则用户必须在运行应用程序时授予应用程序的权限。如果您一次面对用户许可的许可请求，您可能会淹没用户，并导致他们退出您的应用程序。相反，您应该根据需要请求权限。

在某些情况下，一个或多个权限对您的应用程序来说绝对必不可少。一旦应用启动，请求所有这些权限可能是有意义的。例如，如果您制作摄影应用程序，该应用程序将需要访问设备摄像头。当用户第一次启动应用程序时，他们将不会惊讶地被要求允许使用相机。但是，如果相同的应用程序也有一个功能，与用户共享的联系人的照片，你应该不会索要READ\_CONTACTS首先启动权限。相反，请等待用户尝试使用“共享”功能，然后再请求许可。

如果您的应用程序提供了一个教程，在教程序列结尾处请求应用程序的基本权限可能是有意义的。

## 解释为什么你需要权限

当您打电话时系统显示的权限对话框显示requestPermissions()您的应用程序需要 什么权限，但不能说明为什么。在某些情况下，用户可能会发现困惑。向用户解释为什么您的应用程序想要呼叫前的权限是个好主意 requestPermissions()。

例如，摄影应用程序可能想要使用位置服务，因此可以对照片进行地理标记。一个典型的用户可能不明白照片可能包含位置信息，并且会让他们的摄影应用程序想要知道位置的原因感到困惑。所以在这种情况下，应用程序在调用 之前告诉用户这个功能是个好主意requestPermissions()。

通知用户的一种方法是将这些请求合并到应用程序教程中。本教程可以依次显示每个应用程序的功能，因此可以解释需要哪些权限。例如，摄影应用程序的教程可以展示其“与您的联系人分享照片”功能，然后告诉用户他们需要授予该应用的权限才能看到用户的联系人。然后，该应用程序可以调用 requestPermissions()以询问用户的访问。当然，并不是每个用户都将遵循本教程，因此您仍然需要在应用程序正常运行期间检查并请求权限。

## 测试两个权限模型

从Android 6.0（API级别23）开始，用户在运行时授予和撤消应用程序权限，而不是在安装应用程序时执行此操作。因此，您必须在更广泛的条件下测试您的应用程序。在Android 6.0之前，您可以合理地假设，如果您的应用程序正在运行，则它具有在应用程序清单中声明的​​所有权限。在新的权限模型下，您将无法再做出这样的假设。

以下提示将帮助您识别运行API级别23或更高版本的设备上与权限相关的代码问题：

* 确定您的应用程序的当前权限和相关的代码路径。
* 测试用户流经受权限保护的服务和数据。
* 用许可或撤销权限的各种组合进行测试。例如，相机应用可能会列出CAMERA，READ\_CONTACTS以及 ACCESS\_FINE\_LOCATION 在其清单。您应该测试应用程序，其中的每个权限都打开和关闭，以确保该应用程序可以正常处理所有权限配置。请记住，从Android 6.0开始，用户可以为任何应用启用或禁用权限，即使是针对API级别为22或更低的应用。
* 使用adb工具从命令行管理权限：

  ```
  按组列出权限和状态：
  >$ adb shell pm list permissions -d -g
  授予或撤销一个或多个权限：
  >$ adb shell pm [grant|revoke] <permission-name> ...
  ```

分析您的应用程序使用权限的服务。

reference: <https://developer.android.com/training/permissions/usage-notes.html>
