Android 运行时权限申请之电话权限(兼容6.0以上)

Android 运行时权限申请之电话权限(兼容6.0以上)

运行时权限的申请一般是危险权限的申请,在android 6.0以后,所有的危险权限都需要用户手动的确认是否开启。下面图片是所有的危险权限。不必牢记,需要用的时候直接查询即可。本文来看电话权限的申请。
Android 运行时权限申请之电话权限(兼容6.0以上)_第1张图片

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替换成位置权限即可

你可能感兴趣的:(Android)