在Android6.0中加入了运行时权限,用户不需要在安装的时候指定所有的申请权限,而是在软件使用过程中再对某一权限进行授权。
如果在运行时添加了一次权限,那么以后就会默认全部添加权限,但是用户如果以后想要再次更改权限,可以到
Setting->Apps->RuntimePermissionTest->Permissions进行权限关闭
下表列举了所有的运行时权限,我们在运行时权限处理使用的是权限名,但是一旦某一个权限被授权了,那么该权限组中的所有权限都会被授权。
权限组名 | 权限名 |
CALENDAR | READ_CALENDAR |
WRITE_CALENDAR | |
CAMERA | CAMERA |
LOCATION | ACCESS_FINE_LOCATION |
ACCESS_COARSE_LOCATION | |
CONTACTS | READ_CONTACTS |
WRITE_CONTACTS | |
GET_ACCOUNTS | |
PHONE | READ_HPONE_STATE |
CALL_PHONE | |
READ_CALL_LOG | |
WRITE_CALL_LOG | |
ADD_VOICEMAIL | |
USE_SIP | |
PROCESS_OUTGOING_CALLS | |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS |
RECEIVE_SENSORS | |
READ_SENSORS | |
RECEIVE_WAP_PUSH | |
RECEIVE_MMS | |
MICROPHONE | RECORD_AUDIO |
STORAGE | READ_EXTERNAL_STORAGE |
WRITE_EXTERNAL_STORAGE |
示例:打电话权限
首先在manifest中需要配置权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
然后在MainActivity中进行检测
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
call();
}
private void call() {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
在程序中需要使用
ContextCompat.checkSelfPermission()方法判断用户是否已经授权,该方法接受两个参数,第一个是context上下文,第二个参数是需要授权的权限名,返回值是一个int值,然后与
PackageManager.PERMISSION_GRANTED进行比较,相等说明已经授权,否则即为没有授权。
没有授权就调用ActivityCompat.requestPermissions()方法用来向用户申请授权,该方法接受三个参数,第一个是当前活动的实例,第二个参数是一个字符串数组,包含了申请的权限,第三个参数是请求码。该方法调用完成之后会弹出一个对话框,让用户选择是否授权,不管授权与否都会回调onRequestPermissionsResult()方法,授权的结果会保存在该方法的第三个参数中
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call();
} else {
Toast.makeText(MainActivity.this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}