一、概述
android6.0最大的新特性就是在权限的处理上进行了“大改革”。
1、6.0之前的版本权限的授予都是在应用安装的时候授予的,这样的方式对于开发者来说很方便,只要在Manifest文件上授予相应权限即可。但对于用户来说就是一件很危险的事情,因为用户安装应用并不会仔细去看具体是哪些权限,基本都是默认安装,然后能够使用app就行了,这样有很大的安全隐患。
2、Android6.0开始权限不再是安装的时候授予这么简单,谷歌官方还对权限进行了分类。一般的权限,即一些不涉及到用户隐私方面的权限的话,是不需要用户进行授权的。但另外一种是危险权限,如果用户进行某个需要危险权限的操作时,就必须用户授予了危险权限才会进行下去,否则用户是无法完成操作。例如一个用户要向sd卡写入文件,就必须在写入操作时,弹出dialog提示用户是否给予存储权限。这样用户在使用应用时就会清楚知道哪些操作需要什么权限,然后根据个人意愿进行授权,在安全上有很大的提升。
二、实例
上面扯到一些闲话,下面通过代码初步了解一下Android6.0怎么授权
//判断当前sdk版本是否大于23
private boolean canMakeSmores(){
return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);
}
首先、要进行判断手机的版本是否在Android6.0及以上,如果不是的话就没有必要进行后续操作。
//申请写外部sd卡的权限
public void myRequestPermissions(int permsRequestCode){
String[] perms={"android.permission.WRITE_EXTERNAL_STORAGE"};
ActivityCompat.requestPermissions(this,perms, permsRequestCode);
}
这一步就是定义好一个请求权限的方法,关键点再于requestPermissions()方法,这个方法传递三个参数,第一个Context对象,第二个是一个字符串数组,也就是我们要申请的权限其对应的字符,第三个就是整型的权限请求码,这个可以自行决定,但不同的权限申请最好是不同的请求码。
@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){
switch(permsRequestCode){
case 200:
boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
if(writeAccepted){
screenshot();
}else{
hasRejected();
//用户授权拒绝之后,友情提示一下就可以了
}
break;
case 201:
boolean readAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
if(readAccepted){
Intent intent=new Intent(MainActivity.this,RecordActivity.class);
startActivity(intent);
}else{
hasRejected();
//用户授权拒绝之后,友情提示一下就可以了
}
break;
}
}
上面是重写一下onRequestPermissionsResult方法,这个方法会对requestPermissions方法进行监听,只要一调用requestPermissions方法,onRequestPermissionsResult方法就好做出相应的处理
首先我是根据不同的请求码进行分支处理,
然后根据下面代码判断该权限是否已经授权了,如果授权了就直接可以截屏了(我这里是截屏操作要进行存储权限的授予)。如果没有就好弹出一个自定义好的dialog,关于这个dialog下面再细说。
boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
既然基本的方法已经定义好,那么就必须在相应的操作进行监听
case R.id.btn_cat:
if(canMakeSmores()){
if(ActivityCompat.shouldShowRequestPermissionRationale(this,"android.permission.WRITE_EXTERNAL_STORAGE")) {
hasRejected();
}else {
myRequestPermissions(permsRequestCode1);
}
}else {
screenshot();
}
break;
例如我在截屏的点击事件的具体操作如上代码,简单点就是先判断是否为Android6.0及以上版本,是就进行权限申请,否则直接进行截屏操作screenshot方法就是截屏方法。当然上面的代码我又做了一层处理,就是判断是否已经处理过一次这个权限的申请,这里用到了一个官方的方法shouldShowRequestPermissionRationale(),该方法传递两个参数,一个Context对象,还有对应权限字符串,如果已经授权了就返回false,如果上次是拒绝授权的就会返回true。
返回false就不解释了,就是可以直接截屏,如果返回true就会弹出一个自定义dialog,这个dialog提供一个权限简单说明以及一个跳转到应用权限设置的界面进行权限处理,跳转的方法如下:
//跳转到应用程序自身的权限设置页面
private void getAppDetailSettingIntent() {
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
localIntent.setAction(Intent.ACTION_VIEW);
localIntent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
}
startActivityForResult(localIntent,0);
}
这个是网上找到的一个跳转到自身应用的权限设置界面的方法,具体实现方式就不做说明。以上算是对6.0权限处理的初步使用,还有批量申请的内容也不做说明了,详细的权限申请可以参考下面地址:
http://www.tuicool.com/articles/rYBnau