2017-3-8(Android6.0动态权限)
2017-03-08 本文已影响380人
721d739b6619
在android6.0机器中会出现某些权限需要动态添加,不然会导致闪退或点击没有反映的情况。本人在开发过程中就出现过这样的报错信息:
java.lang.SecurityException: getDeviceId: Neither user xxxxx nor current process hasAndroid.permission.READ_PHONE_STATE.
就是在三星的6.0机子,但在测试过程中,发现不是所有6.0或6.0以上的机子都会出现这样的情况。好吧,出现状况就要修复bug。
网上搜索了一下资料发现:
使用Android Studio编译项目的时候将app/build.gradle中的defaultConfig设置中的targetSdkVersion设置为了23, 这样 Android Studio在编译的时候会使用 Android 23 API即Android 6.0来编译项目,但是,如果你没有给项目加上动态权限请求的话,你的应用在安装到手机的时候将不会获取任何权限!!!可以去查看应用的应用信息,其中的Permissions权限列表中所有的权限组都是关闭状态。
这是别人家博客的原话,出处:blog.csdn.net/zhufuing/article/details/51217969
这个博客也说了解决方案:其一是用23一下编译,目标编译版本更改为23以下。其二是动态添加权限。
第一种方法我没有尝试过,由于我这个项目是ionic混搭项目,里面有些地方要求需要到6.0的版本,所以我使用了第二种解决方案即动态添加权限;
另外哪些属于需要动态添加的权限哪些不需要,鸿翔大神的博客说得十分清楚,这里贴个链接出来:blog.csdn.net/lmj623565791/article/details/50709663
下面是我自己封装了动态添加权限的代码,主要参考这个网站的:
blog.csdn.net/lebang08/article/details/52751088
首先我将判断动态权限的代码写在BaseActivity上:
再次,请求权限:
请求权限回调:
还有一个就是拥有权限后具体业务逻辑:
在具体的Activity上基本就是重写实现具体业务逻辑的这个方法;这里其实也可以写接口实现,不一定在BaseActivity写一个空方法。
具体的实现逻辑是:
判断版本否是6.0以上 ----> 是,判断是否拥有这些权限 --->拥有,实现具体业务逻辑 -----> 没有,动态请求该权限 ----->回调方法,判断是哪一权限---->实现具体业务逻辑
下面是具体的Activity的操作: