安卓6.0权限的点滴记录

安卓6.0权限的点滴记录

安卓权限问题:
  1. 当android:targetSdkVersion属性值<23时,系统会认为APP还没有支持新的权限系统而不会异常退出
  2. 当android:targetSdkVersion属性值>=23时,如果APP在运行时没有获得相关的权限,将会异常退出。

申请权限步骤

1.申明该权限

在AndroidManifest中申明权限

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

2.判断是否为安卓6.0以上系统

if (Build.VERSION.SDK_INT >= 23) {
    requestPermission();
}

3.检查是否已经有该权限,如果没有则进行申请权限

private static final int Write_Permission = 100;
private void requestPermission() {
    //1. 检测APP是否在manifest中声明了该权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {   
        //2.checkSelfPermission方法返回值不是PERMISSION_GRANTED,权限没有开启,请求权限
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Write_Permission);
    }else{
        //权限已经开启
    }
}

4.接收申请成功或者失败回调

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == Write_Permission) {
        if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //权限被用户同意
        } else {
            //权限被用户拒绝
             showDialog(this,"权限被禁止,无法使用此功能。是否开启该权限?(步骤:应用信息->权限)");
        }
    }
}



private void showDialog(Context context,String msgInfo) {
        new AlertDialog.Builder(context)
                .setTitle("温馨提示")
                .setMessage(msgInfo)
                .setNegativeButton("取消", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setPositiveButton("设置",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //前往应用详情界面
                        try {
                            Uri packUri = Uri.parse("package:"+getPackageName());
                            Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,packUri);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            this.startActivity(intent);
                        } catch (Exception e) {
                            //跳转失败
                        }
                        dialog.dismiss();
                    }
                }).create().show();
    }

注意事项:

shouldShowRequestPermissionRationale()
  • 为了帮助查找用户可能需要解释的情形,Android 提供了一个实用程序方法,即 shouldShowRequestPermissionRationale()。如果应用第一次请求此权限但用户拒绝了请求,此方法将返回 true。
  • 如果用户第一次拒绝了权限请求,并在权限请求系统对话框中选择了“不再提醒”选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。
  • 注:某些机型(例如使用miui系统的机型)在用户第一次拒绝权限申请时该方法会返回false并且在之后不会再弹出权限申请对话框,这主要是miui在底层修改了此方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值