Android 6.0(API 23)及以上动态权限申请的方法

一、为什么需要用户手动赋予权限

以下摘录自Google官方文档:https://developer.android.com/training/permissions/requesting#normal-dangerous

系统权限分为两类:正常权限和危险权限
正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。

二、什么权限会被定义为危险权限

权限组来自Google官方文档:https://developer.android.com/guide/topics/security/permissions#normal-dangerous

权限组 权限
CALENDAR
  • READ_CALENDAR
  • WRITE_CALENDAR
CAMERA
  • CAMERA
CONTACTS
  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS
LOCATION
  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION
MICROPHONE
  • RECORD_AUDIO
PHONE
  • READ_PHONE_STATE
  • CALL_PHONE
  • READ_CALL_LOG
  • WRITE_CALL_LOG
  • ADD_VOICEMAIL
  • USE_SIP
  • PROCESS_OUTGOING_CALLS
SENSORS
  • BODY_SENSORS
SMS
  • SEND_SMS
  • RECEIVE_SMS
  • READ_SMS
  • RECEIVE_WAP_PUSH
  • RECEIVE_MMS
STORAGE
  • READ_EXTERNAL_STORAGE
  • WRITE_EXTERNAL_STORAGE

三、动态权限的获取(第三方库方法)

第一步:在AndroidManifest.xml中申明你所需要用到的危险权限

第二步:在build.gradle中添加依赖的第三方库

(注意:在AndroidStudio3.0及以上版本中compile已被弃用,其方法更改为api 或 implementation)

implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
implementation 'io.reactivex:rxjava:1.1.6'

第三步:在代码中获取权限

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//检测当前版本是否为6.0及其以上 
            RxPermissions.getInstance(this)
                .request(
                        //申请的危险权限添加在此,可申请多个危险权限
                        Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.READ_EXTERNAL_STORAGE)
                .subscribe(new Action1() {
                    @TargetApi(23) //如果build.gradle申明的最小版本低于23,则需要添加此句兼容低版本
                    @Override
                    public void call(Boolean granted) {
                        if (granted) {
                            //权限被全部同意
                            Log.d("权限", "权限被同意 ");

                        } else if(shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE) 
                                | shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)){
                            //用户拒绝了权限
                            Log.d("权限", "权限被拒绝 ");

                        }else{
                            Log.d("权限", "权限被拒绝,并且勾上不再询问 ");
                            //用户拒绝了权限,并且勾上了不再询问

                        }
                    }
                });
        }else{
            //版本低于Android6.0,危险权限不需要用户同意
            Log.d("权限", "版本低于6.0,直接进入主程序");
        }

以上就是Android 6.0以上获取动态权限的方法

你可能感兴趣的:(Android,学习)