安卓 6.0 需要申请的运行时权限 整理 使用

群友在做权限申请这发问,哪些权限不能够直接使用,而是需要临时申请的,整理一下,用代码说话。

SMS短信权限 
Manifest.permission.SEND_SMS
Manifest.permission.RECEIVE_SMS
Manifest.permission.READ_SMS
Manifest.permission.RECEIVE_WAP_PUSH
Manifest.permission.RECEIVE_MMS


STORAGE存储卡 
Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.WRITE_EXTERNAL_STORAGE


CONTACTS联系人权限  
Manifest.permission.READ_CONTACTS
Manifest.permission.WRITE_CONTACTS
Manifest.permission.GET_ACCOUNTS


PHONE手机权限  
Manifest.permission.READ_PHONE_STATE
Manifest.permission.CALL_PHONE
Manifest.permission.READ_CALL_LOG
Manifest.permission.WRITE_CALL_LOG
Manifest.permission.ADD_VOICEMAIL
Manifest.permission.USE_SIP
Manifest.permission.PROCESS_OUTGOING_CALLS


CALENDAR日历权限  
Manifest.permission.READ_CALENDAR
Manifest.permission.WRITE_CALENDAR


CAMERA相机权限  
Manifest.permission.CAMERA


LOCATION位置权限  
Manifest.permission.ACCESS_FINE_LOCATION
Manifest.permission.ACCESS_COARSE_LOCATION


SENSORS传感器权限  
Manifest.permission.BODY_SENSORS


MICROPHONE麦克风权限  
Manifest.permission.RECORD_AUDIO

简单整理了一下,方便日后的复制

//短信权限
public static String[] SMS_PERNISSION = { Manifest.permission.RECEIVE_SMS,
        Manifest.permission.RECEIVE_SMS,Manifest.permission.READ_SMS,
        Manifest.permission.RECEIVE_WAP_PUSH,Manifest.permission.RECEIVE_MMS};
//STORAGE存储卡权限
public static String[] STORAGE_PERNISSION = { Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE};
//LOCATION位置权限
public static String[] LOCATION_PERNISSION = { Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION};
//CONTACTS联系人权限
public static String[] CONTACTS_PERNISSION = { Manifest.permission.READ_CONTACTS,
        Manifest.permission.WRITE_CONTACTS,Manifest.permission.GET_ACCOUNTS};
//CAMERA相机权限
public static String[] CAMERA_PERNISSION = { Manifest.permission.CAMERA};

权限有了,那么使用也简单说一下吧,能用RxPermission最好,如果不会用,下面是最简单的方式(在activity或fragment中)

1首先确定你需要的权限,因为一般都是几个权限一起完成一个功能,所以我习惯性写成数组的形式。这里以定位举例吧。

2先判断你是否申请过(定位)权限,在第一次打开软件的时候如果你允许了的话,以后的每一次都不需要再进行申请了,相反,如果你拒绝了,一般为以后的每一次还会提醒你。用代码说话。

假定,你要在有权限时实现的方法为a();

首先判断你是不是需要申请权限

private void initPermission() {
//用定位权限进行举例,调用permissionAllGranted方法,判断是否需要申请权限
    boolean permission = permissionAllGranted(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION});

    if (!permission) {
        //没有权限时
        //请求权限
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION}, 1);
//这里的1为requestCode,你可以写成任意的数字
    }else {
      //有权限时     
       a();
    }
}
private boolean permissionAllGranted(String[] permissions) {
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            // 只要有一个权限没有被授予, 则不能完成你需要的功能就返回 false
            return false;
        }
    }
    return true;
}

当你申请权限时,系统会自动弹出一个让用户选择是否要授予权限的弹窗,当用户选择完,结果在onRequestPermissionsResult方法中进行返回,这是一个重写的方法。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1 && grantResults.length > 0) {//将这里的requestCode改成你的任意数字,上边的一致就行
        boolean granted = grantResults[0] == PackageManager.PERMISSION_GRANTED;//是否授权,可以根据permission作为标记
        if(granted){//true为授予了
           a();
        }else{//
         没有授予,比如可以给用户弹窗告诉用户,你拒绝了权限,所以不能实现某个功能,如果想实现你可以跳转到设置,如果不想实现那么直接把这个弹窗取消
        }
    }
}

Fragment权限的申请

例子实在activity中用的,如果在activity下的Fragment中使用,那么用所在的Fragment,XXFragment.this.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION}, 1);当你在Fragment下的Fragment时也这么申请

Fragment申请的返回

在Fragment中如果使用ActivityCompat.requestPermissions进行申请,那么你的返回会在你所在的Fragment的Acticity的权限回调方法中返回,所以请在申请时注意了。如果你在Fragment中使用了Fragment的申请方法但是还是没收到返回,那么你是否所在得Fragment被嵌套在另一个FragmentA内?如果有那么看看你的FragmentA的权限回调里是否有,如果有,那么就传递给你需要的Fragment吧,代码我就不写了,百度一搜就有。

不好意思csdn的编辑器我不太会用,格式都乱了。懂了吧,直接复制吧,很简单的。有时间我补一篇RxPermission的。

猜你喜欢

转载自blog.csdn.net/qq_36467463/article/details/81118754