Android 运行时权限申请之电话权限(兼容6.0以上)
运行时权限的申请一般是危险权限的申请,在android 6.0以后,所有的危险权限都需要用户手动的确认是否开启。下面图片是所有的危险权限。不必牢记,需要用的时候直接查询即可。本文来看电话权限的申请。
1.首先在AndroidManifest.xml中申明权限
<!--拨打电话权限-->
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
2.当android 6.0以下时直接运行以下代码就可以调用拨打电话了
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("10086"));
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
3.但在android 6.0以后,由于安全问题,拨打电话属于危险权限,需要用户手动去开启。
除了同样在启动的时候申明权限外,需要在运行的时候进行权限的判断。checkSelfPermission接收上下文和打电话权限两个参数,PERMISSION_GRANTED代表用户同意开启打电话权限。所以上面的代码修改下面的代码,就能同时兼容6.0以上和以下的版本了:
//弹出权限检查
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}else {
callPhone();
}
/**
* 拨打电话
*/
private void callPhone(){
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("10086"));
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}
/**
* 监控权限变化
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch(requestCode){
case 1:
if (grantResults.length>0&&grantResults[0] == PackageManager.PERMISSION_GRANTED){
callPhone();
}
break;
default:
}
}
ps:本文只是拿打电话权限来举事例,如别的权限还有位置权限,我们只需要把Manifest.permission.CALL_PHONE替换成位置权限即可