本文翻译自google官方文档,原文链接为Android develops 中文网
当我们的app请求权限时,很容易让用户感到不适。如果用户对app使用体验感到失望,或者是担心app会获取他们的个人信息,用户将避免再使用app,更有甚者直接卸载。下面有一些比较好的做法来帮助你避免这种情况的发生。
考虑使用 Intent
在大多数情况下,你有两种方式去完成你的功能。一种是,在app中请求权限,自己完成相关的操作;另外,也可以使用Intent去调用其他的app来实现功能。
举个例子,假如你的app需要使用设备的拍照功能,你可以请求Android系统中的CAMERA权限,它可以让你直接调用摄像头,然后可以使用相机相关API控制相机以及拍照。这种方法能够让app完全控制相机,并且需要你在app中包含使用camera功能的UI界面。
然而,如果你并不需要对相机的完全控制权限,可以使用携带 ACTION_IMAGE_CAPTURE 的 Intent 去获取一张图片。当你发送了这样的 Intent ,系统会提示用户去选择一个相机app(如果没有设置默认的相机),用户使用选中app拍照之后,会将图片数据返回给 onActivityResult() 方法。
相似的,如果需要拨打电话、访问联系人等等,也可以通过发送相关的 Intent 或者请求权限直接访问相关的对象来实现功能。下面列出了两种方式的优缺点。
如果使用权限:
- 当你的app执行操作时,拥有对用户体验的完全掌控。但是这样也增加了编程的复杂度,因为你需要设计并实现相关的UI界面。
- 权限提示只会出现一次,在app运行时或者安装时(这取决于系统的版本)。在这之后,你的app不需要再向用户请求相关权限,可以直接完成操作。但是如果用户在权限提示时,拒绝了授予权限,你的app将不能再完成与所请求的权限有关的操作。
如果使用 Intent:
- 你不需要设计实现操作界面,处理你发送 Intent 的app会提供界面。但是这意味着你不能把握用户体验了,用户可能会被一个你从未见过的app所影响。
- 如果用户没有设置默认的app,系统会提示用户去选择一个app去操作,此时如果用户也不指定一个默认的处理方式,那么当他每次使用同样的功能时,都会弹出一个额外的对话框。
只请求你需要的权限
当每次你请求一个权限,你都在迫使用户做出决定。你应该将你的请求权限的次数尽量做到最小化。如果用户使用的Android 6.0或者更高版本的系统,当他们每次尝试app里一些需要权限的新功能,请求权限的提示将会打断用户的操作。而如果用户使用早期的Android系统(Andorid 5.1或者更早)时,需要在安装时给app所需要的权限授权;假设权限太多,列表太长亦或者权限看起来不合适,用户可能会决定不再安装你的app。基于这些原因,你应该使你的app所需要的权限数量最小化。
不要压垮用户
如果用户使用的是 Android 6.0或者更高的版本,他需要在运行app时进行授权。假如你让用户一次面对很多的权限请求,可能让用户不爽从而导致退出app。相反的,你应该在使用到权限时才去请求。
在一些情况下,一个或多个权限对你的app来说是必不可少的,可能比较合理的做法是在app启动时尽快去请求这些权限。例如,你开发了一个与拍照相关的app,它需要访问相机。当用户第一次打开app时不会对请求拍照权限感到惊讶。但是,如果这个app还有将照片分享给联系人的功能,你不应该在app第一次启动时就申请 READ_CONTACTS 权限,相反地,在用户使用到分享功能才去请求权限。
如果你的app提供了使用引导,在引导结束之后再去申请app必不可少的权限才是合理的。
向用户解释你为什么需要那些权限
当你调用 requestPermissions() 方法时,系统提示的权限对话框,只说了你的app需要哪些权限,并没有解释为什么。有些情况下,用户会对此感到困惑。所以在调用 requestPermissions() 之前,向用户解释为什么需要这些权限将会是一个好方法。
举个例子,一个拍照的app可能需要使用定位服务来给照片标注地理位置,但是对一个普通的用户来说,他可能不会理解照片会包含位置信息,并且对一个拍照app想获取位置感到很疑惑。所以在这种情况下,在调用 requestPermissions() 请求权限之前,告知用户这些功能特征是很好的做法。
在app引导中加入需要告知用户的权限信息是一种方式。app引导可以按顺序显示app的功能,然后能解释为什么需要权限。例如,拍照app的引导展示了“分享照片给联系人”功能,接着告诉用户需要授权让app去访问联系人信息。然后,app就可以调用 requestPermissions() 请求权限。当然,不是每一个用户都会跟随引导操作,所以你也必须在app正常运行时检查和请求相应的权限。
对权限模式都进行测试
从Android 6.0开始,在app运行时用户可以进行授权和取消授权,代替了在app安装时的操作。其结果是,你必须在更多的条件下测试你的app。在Android 6.0 之前,你可以保证app一直会正常运行,因为它拥有在manifest声明的所有权限;但是在新的权限模式下(即 6.0之后),你不能做出这样的假设。
下面这些技巧将帮助你找出与权限相关的代码问题,运行在 API 23或更高级别设备上的。
- 确认你的app当前的权限和它的代码路径
- 对需要权限的服务和数据进行用户流程操作的测试
- 测试不同的授权和取消授权组合,比如,一个相机app可能在manifest里声明了CAMERA,READ_CONTACTS和ACCESS_FINE_LOCATION等权限。你应该逐个测试这些权限打开和关闭的情况,以保证所有的权限配置可以正常运行。记住,从Android 6.0开始,用户能够对任何app的权限进行开关操作,包含target API 22 或者更低的。
在命令行使用adb命令来管理权限:
列出权限组和状态
adb shell pm list permissions -d -g
授权或取消授权
adb shell pm [grant|revoke] permission-name …
根据使用了权限的服务分析你的app