Android 6.0以上系统使用RxPermissions申请动态权限

当app运行在Android 6.0以上操作系统是,需要对dangerous permission进行动态权限申请,关于dangerous permission见文章最后的表格。

首先,根据Google官方文档中对于dangerous permission的动态申请流程,示例如下:

requestPermission(){

//查看当前的Activity是否拥有联系人读取权限
if (ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS) != packageManager.PERMISSION_GRANTED) {
    // Should we show an explanation?
	//是否需要对权限做出一些解释
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) {
	//异步地给用户显示相关解释,此线程一直等候用户看到解释并响应并再次请求权限
      
  } else {
      //不给用户权限解释,直接申请权限
      ActivityCompat.requestPermissions(thisActivity,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);

       // MY_PERMISSIONS_REQUEST_READ_CONTACTS 是自定义的整形常量,主要与回调方法中定位原始请求		
    }
}
}

调用requestPermission()方法,即可向系统申请权限。

☆ 注:当您的应用调用 requestPermissions() 时,系统将向用户显示一个标准对话框。您的应用无法配置或更改此对话框。
如果您需要为用户提供任何信息或解释,您应在调用 requestPermissions() 之前进行,如解释应用为什么需要权限中所述。

请求权限操作会通过下面的回调方法返回数据


@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
		//请求权限时的int类型的变量
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
           	//如果请求被取消了,那么grantResults结果集为空
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
				//权限被授予,可进行与前申请的权限有关的操作了
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
				//权限申请被拒绝,该权限相关的所有操作无法进行
            }
            return;
        }
		//可使用其他的case来处理其他的权限请求
    }
}
系统显示的对话框说明了应用需要访问的权限组;它不会列出具体权限。例如,如果请求 READ_CONTACTS 权限,系统对话框只显示应用
需要访问设备的联系人。用户只需要为每个权限组授予一次权限。如果应用请求该组中的任何其他权限(已在您的应用清单中列出),
系统将自动授予应用这些权限。当请求此权限时,系统会调用onRequestPermissionsResult() 回调方法,并传递 PERMISSION_GRANTED,
如果用户已通过系统对话框明确同意权限请求,系统将采用相同方式操作。

 以上是Google官方文档中的关于动态权限申请的实例。关于多个权限申请,推荐使用RxPermissions框架。gradle文件中添加以下依赖

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

需要申请的权限:

public static final String[] permissionsRequired = {Manifest.permission.RECEIVE_MMS,Manifest.permission.READ_CALL_LOG};

使用RxPermissions申请权限:

RxPermissions.getInstance(MainActivity.this)
		//传入数组,也可以使用不定长参数,多个权限用","隔开
		.request(permissionsRequired)
		.subscribe(new Action1<Boolean>() {
			@Override
			public void call(Boolean aBoolean) {
				if (aBoolean) {
					//当所有权限都允许之后,返回true
					Log.i("permissions", "btn_more_sametime:" + aBoolean);
				} else {
					//只要有一个权限禁止,返回false,
					//下一次申请只申请没通过申请的权限
					Log.i("permissions", "btn_more_sametime:" + aBoolean);
					finish();
				}
			}
	});

 OK,完成了。

下表是Dangerous Permission列表

 

Dangerous Permission
Permission GroupPermissions
CALENDARREAD_CALENDAR
WRITE_CALENDAR
CAMERACAMERA
CONTACTSREAD_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATIONACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONERECORD_AUDIO
PHONEREAD_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORSBODY_SENSORS
SMS SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGEREAD_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值