关于安卓6.0的运行时权限

来源:互联网 发布:软件过程模型 编辑:程序博客网 时间:2024/04/30 12:33

关于安卓6.0的运行时权限,之前只需要再manifest清单中配置即可。6.0之后加入了运行时权限。

参考文章:http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/

以拨打电话为例:之前只需要再manifest清单中配置如下权限:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"          package="com.looker.test">    <!--拨打电话权限-->    <uses-permission android:name="android.permission.CALL_PHONE"/>

然后遇到的问题是,在Android6.0目标平台下,即便已经添加了打电话的权限,运行时依然会报错安全异常:权限被拒绝。

可以在代码中加入系统版本判断,如果6.0及以上需要获取运行时权限;

    /***     * 判断权限     */    private void checkPermission() {        //判断手机版本号是否6.0        if(Build.VERSION.SDK_INT >= 23){            // 检查是否获得了权限(Android6.0运行时权限)            if (ContextCompat.checkSelfPermission(getActivity(),                    Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){                // 没有获得授权,申请授权                if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),                        Manifest.permission.CALL_PHONE)) {    // 返回值:    // 如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true.    // 如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false.    // 如果设备策略禁止应用拥有这条权限, 这个方法也返回false.    // 弹窗需要解释为何需要该权限,再次请求授权                            Toast.makeText(getActivity(), "请授权!", Toast.LENGTH_LONG).show();                        // 帮跳转到该应用的设置界面,让用户手动授权                       Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);                       Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);                       intent.setData(uri);                       startActivity(intent);                 }else{                    // 不需要解释为何需要该权限,直接请求授权                    ActivityCompat.requestPermissions(getActivity(),                            new String[]{Manifest.permission.CALL_PHONE}, 0);                }            }else {                // 已经获得授权,可以打电话                callPhone();            }        }else {            callPhone();        }    }    /***     * 拨打电话     */    private void callPhone() {        Intent intent = new Intent();        intent.setAction(Intent.ACTION_CALL);        intent.setData(Uri.parse("tel: 13675082546"));        startActivity(intent);    }
0 0