1. 运行时获得权限:
从android6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭。
2. 检查是否获得权限:
通过 ContextCompat.checkSelfPermission(context,permission)方法,方法返回值为 PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(PermissionActivity.this, "hava this permission", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(PermissionActivity.this, "no this permission", Toast.LENGTH_SHORT).show();
}
3. 请求权限:
通过ActivityCompat.requestPermissions(activity,permissions,requestCode)第二个参数是一个String数组,第三个参数是请求码便于在onRequestPermissionsResult 方法中根据requestCode进行判断.
ActivityCompat.requestPermissions(PermissionActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
4. 请求权限后的回调:
请求权限后会回调onRequestPermissionsResult方法,在activity中重写onRequestPermissionsResult(requestCode,permissions,grantResults)方法 grantResults是int类型的数组每个值为PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED 分别对应permissions的每个请求.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 0:
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i]==PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,permissions[i]+"已授权",Toast.LENGTH_LONG).show();
}else {
Toast.makeText(MainActivity.this,permissions[i]+"拒绝授权",Toast.LENGTH_LONG).show();
}
}
break;
case 1:
if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
callDirectly(mMobile);
}else {
Toast.makeText(MainActivity.this,"Permission Denide",Toast.LENGTH_SHORT).show();
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
5. 告诉用户为何需要权限:
private void onCallPhone(String mobile) {
mMobile=mobile;
int checkCallPhonePermission=ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE);
if (checkCallPhonePermission!=PackageManager.PERMISSION_GRANTED){
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)){
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("应用需要开启拍照的权限,是否继续?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
}else {
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}
}else {
callDirectly(mobile);
}
}