权限使用注意事项
权限使用注意事项
一个应用程序很容易淹没拥有权限请求的用户。如果用户发现应用程序令人沮丧,或者用户担心应用程序可能在使用该用户的信息,可能会避免使用该应用程序或将其完全卸载。以下最佳做法可以帮助您避免这样糟糕的用户体验。
考虑使用意图
在许多情况下,您可以通过两种方式为应用程序执行任务。您可以让您的应用程序请求执行操作本身的权限。或者,你可以有应用程序使用意图有另一个应用程序执行的任务。
例如,假设您的应用程序需要能够使用设备摄像头拍照。您的应用程序可以请求CAMERA许可,允许您的应用直接访问相机。然后,您的应用程序将使用相机API来控制相机并拍摄照片。这种方法可以让您的应用程序完全控制摄影过程,并且可以将摄像头UI整合到应用程序中。
但是,如果您不需要这样的完全控制,您可以使用ACTION_IMAGE_CAPTURE意图来请求图像。当您发送意图时,系统提示用户选择相机应用程序(如果还没有默认的相机应用程序)。用户使用所选的相机应用程序拍摄照片,该应用程序会将照片返回到应用程序的onActivityResult()方法。
同样,如果您需要打电话,访问用户的联系人等等,您可以通过创建适当的意图来做到这一点,或者您可以请求权限并直接访问相应的对象。每种方法都有优缺点。
如果您使用权限:
执行操作时,您的应用程序可以完全控制用户体验。但是,由于您需要设计合适的UI,因此广泛的控制会增加您的任务的复杂性。
系统会提示用户在运行时或安装时给予权限(具体取决于用户的Android版本)。之后,您的应用程序可以执行操作,而不需要用户的额外交互。但是,如果用户未授予权限(或稍后撤销),则您的应用程序将无法完成该操作。
如果您使用意图:
您不必为操作设计UI。处理意图的应用程序提供了UI。但是,这意味着您无法控制用户体验。用户可以与您从未见过的应用互动。
如果用户没有该操作的默认应用程序,系统会提示用户选择一个应用程序。如果用户没有指定默认处理程序,则每次执行操作时可能需要经过一个额外的对话框。
只需要你需要的权限
每次您要求许可时,强制用户作出决定。您应该尽量减少进行这些请求的次数。如果用户运行Android 6.0(API级别23)或更高版本,每次用户尝试一些需要许可的新应用程序功能时,应用程序必须通过权限请求中断用户的工作。如果用户正在运行较早版本的Android,则用户必须在安装应用时授予每个应用的权限; 如果列表太长或看起来不合适,用户可能会决定不安装您的应用程序。由于这些原因,您应该最小化您的应用程序所需的权限数量。
您的应用程序通常可以避免通过使用意图来请求许可 。如果功能不是应用功能的核心部分,那么您应该考虑将工作交给另一个应用程序,如“ 使用意图”一节中所述。
不要压倒用户
如果用户正在运行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工具从命令行管理权限:
分析您的应用程序使用权限的服务。
reference: https://developer.android.com/training/permissions/usage-notes.html
Last updated