最近需要实现一个相机的小需求,涉及到了动态获取权限的内容。然而这部分我一直不怎么清晰,借着这个机会理清一下思路。先用起来再说。
在Android6.0之后,如果应用程序要进行一些需要危险权限的操作,需要在运行时动态地通过代码申请权限。关于这些理论网络上的前辈们已经写过很多了,这里明确一下流程:
首先应该明确:并不是所有的权限都需要动态申请,只有权限等级为“危险(dangerous)”的才需要。涉及危险的权限见下图
需要指出的是,如果应用程序已经获得了某一组(group)中的某一个权限,那么这一组的权限都会被获取。另外无论应用涉及到哪些权限,都应该在Manifest文件中注册。
动态获取权限的过程应该是这样的:
先来看一下代码的组织:
步骤:
1.调用ContextCompat.checkSelfPermission(context,要申请的权限名)。使用该方法先检查你是否已经注册和获得了这个权限。
2.大多数情况下(比如应用第一次运行时),是没有获得权限的,所以才需要我们申请。调用
ActivityCompat.requestPermissions(context,一个存有需要权限的String数组,int常量值作为返回码);【返回码接下来会说】
3.其实到这里申请的部分就已经完成了。但是有时不知你会不会遇到这种情况:打开应用,看到权限请求,请求下方还有一个小勾选框:“不再提示”。如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 “不再提示” 选项,此方法将返回 false。这个方法给了开发人员解释和操作的空间:在询问时可以解释权限的用途;如果权限被拒绝了,也可以提示用户如果需要的话可以手动从设置里开启权限。
4.onRequestPermissionsResult(int返回码, String[] permissions, int[] grantResults)处理权限申请回调的方法。参数里有两个数组,int数组对应string数组,也就是“权限数组”,表示权限的申请结果。与其他的返回码一样,这里的requestCode就是一个标识,用于标记一次申请操作。
举个例子:
可以在onRequestPermissionsResult方法中,一个requestCode对应一个case,有利于分别处理不同申请的操作。
Android运行时权限的快速应用就是这样,其实还可以对这些权限方法进行封装,这部分内容有机会的话我会在以后更新。
最后,谢谢你能读到这里!如果觉得我的内容对你有帮助的话,欢迎来关注我