关于安卓6.0的运行时权限

关于安卓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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值