Android6.0设备上动态获取权限
众所周知,Android 6.0 相比之前的Android版本有一个很大的不同点,就是动态获取权限。今天自己在做拨号功能时,正巧遇到这个问题, 顺手记录下在Android 6.0 上如何动态获取权限。
实现拨号功能
说到拨号,一个 Intent 就搞定,代码如下,
当然 你可别忘了在 Manifest 文件中去声明拨号的权限
<uses-permission android:name="android.permission.CALL_PHONE" />
问题
如果在 Android 6.0 以前的设备上,上面的代码都是没有问题的,但是如果是在 Android 6.0 设备上,并且项目的 targetSdkVersion 你设置的是23,那么 当你执行上面的拨号代码时,程序将会奔溃掉。
此时你肯定想到了 如果 targetSdkVersion 值设置的小于23是不是就不会奔溃了,恩,确实如此, 此时即使使用Android6.0的设备,程序也不会奔溃,原因显而易见,Android 的权限机制是 Android M 后才加入的。从 Android M 开始 应用程序申请的权限是在运行时动态赋给用户的。
解决方案
其实上面已经说了一种取巧的方案,将 targetSdkVersion 设为小于23的值,程序将不会奔溃, 但是在Android 6.0 上你的应用程序依旧拨不了电话,这是真的。所以要想兼容6.0版本,必须通过下面的方式进行代码层面的兼容。
对Android版本做判断,然后对Android 6.0 做特殊处理,代码如下
此时,如果一个Android6.0的用户触发拨号动作,执行上面的代码,那么他将会看到一个很好看的MaterialDialog,如下图所示。
那么用户点击拒绝或者允许,我们怎么才能拿到回调呢,如果能拿到回调,我们就可以根据用户的选择来执行不同的操作了。
这里应该会看到在 ActivityCompat 的 requestPermissions 方法中,最后一个参数是一个requestCode,看到它自然而然想到了经常用到的onActivityResult, 这里当执行 ActivityCompat 的 requestPermissions 方法后有一个回调机制,需要我们在当前 Activity 中实现 onRequestPermissionsResult 这个方法,具体如下