谈谈Android6.0运行时的权限处理
运行时权限介绍
android 6.0在我们原有的androidmanifest.xml
声明权限的基础上,
又新增了运行时权限动态检测,以下权限都需要在运行时判断:
1、身体传感器
2、日历
3、摄像头
4、通讯录
5、地理位置
6、麦克风
7、电话
8、短信
9、存储空间
在 android 6.0 中,app 如果想要获得某些权限,会在应用中弹出一个对话框,让用户确认是否授予该权限。
具体的截图如下:
这要做的好处就是运行一个 app 时可以拒绝其中的某些权限,防止 app 触及到你的隐私(比如说通讯录、短信之类的)。而在 android 6.0 之前,若同意安装 app ,就意味着该 app 可以获取权限列表中的所有权限。(注:这里所指的都是原生 android 系统,比如 miui 之类的第三方 rom 很早就具备了这种功能。)
接下来就来看看相关的 api 吧,首先我们来看看 context.checkselfpermission(string permission)
方法,该方法主要用于检测该 app 是否已经被赋予了某权限,传入的参数有。如果已被赋予,则返回 permission_granted
,否则返回 permission_denied
。
若返回了 permission_denied
,那么我们就要去申请该权限了。这时就要用到 activity.requestpermissions(string[] permissions, int requestcode)
这个方法了。顾名思义,该方法的作用就是申请某些权限了。第一个参数就是要申请的权限,可以看到参数形式是一个数组,也就是说可以一次申请多个权限。而第二个参数就是申请权限的代号,主要用于在之后的回调中选择。
当用户在权限申请的对话框中作出选择后,就会回调 onrequestpermissionsresult (int requestcode, string[] permissions, int[] grantresults)
方法。
第一个参数就是上面的权限代号;
第二个参数是申请的权限数组;
第三个参数就是权限申请的结果。
结合上面的几个方法,可以写出如下所示的权限申请代码模版:
public static final int read_contacts_request_code = 101; // 如果权限没有被授予 if (contextcompat.checkselfpermission(this, android.manifest.permission.read_contacts) != packagemanager.permission_granted) { // 申请权限 activitycompat.requestpermissions(this, new string[]{manifest.permission.read_contacts}, read_contacts_request_code); } else { // todo 权限已经被授予 } @override public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) { super.onrequestpermissionsresult(requestcode, permissions, grantresults); switch (requestcode) { case read_contacts_request_code: if (grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted) { // todo 用户已经授予了权限 } else { // todo 用户拒绝授予权限 } break; } }
在这里,还有一个方法需要注意下,那就是 shouldshowrequestpermissionrationale (activity activity, string permission)
方法。这个方法的作用就是当用户拒绝了某个权限之后,下一次就会显示出需要该权限的说明。
关于运行时申请权限基本就这样了,值得提醒的是,并不是所有的权限都需要运行时申请,只有“危险”的权限才通过运行时来申请。比如说读取联系人、获取位置信息、读写sd卡等等都为“危险权限”,而比如振动、联网、蓝牙等就是普通权限了,就不需要运行时申请了。
说完了运行时申请权限后,另外还有一点需要注意的是,在 android 6.0 显示悬浮窗也有一个“坑”。如果调用平常的显示悬浮窗的方法,会抛出 “permission denied for this window type” 异常。解决的方案就是在显示悬浮窗之前,需要调用一下 settings.candrawoverlays(context) 这
个方法。若该方法返回 true ,则说明用户同意创建悬浮窗;否则可以跳转到相关的设置页面。具体的代码模版如下:
if (build.version.sdk_int >= 23) { if (settings.candrawoverlays(context)) { // 显示悬浮窗 } else { // 跳转到相关的设置页面 intent intent = new intent(settings.action_manage_overlay_permission); startactivity(intent); } } else { // 版本低于android 6.0,直接显示悬浮窗 }
总结
好了,就到这里吧,以上就是android6.0运行时的权限处理的全部问题,希望这篇文章对大家开发android能有所帮助。
上一篇: JVM 参数配置详细介绍
下一篇: PHP重定向与伪静态区别