当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列表
Permission Group | Permissions |
---|---|
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 |