Android之6.0权限检测

本文主要是记录一些零碎的东西

6.0权限检测,放到baseActivity里咯


/**
     * 检查 Camera 权限
     */
    public void checkOrRequestCameraPermission(int requestCode)
    {
        this.checkOrRequestPermission(requestCode,
                Manifest.permission.CAMERA);
    }

    /**
     * 检查录制权限
     */
    public void checkOrRequestRecordPermission(int requestCode)
    {
        this.checkOrRequestPermission(requestCode,
                Manifest.permission.CAMERA,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.RECORD_AUDIO);
    }

    /**
     * 检查 read/write storage 权限
     */
    public void checkOrRequestStoragePermission(int requestCode)
    {
        this.checkOrRequestPermission(requestCode,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }

    /**
     * 检查 拍照 权限 ( camera + external storage )
     */
    public void checkOrRequestTakePicturePermission(int requestCode)
    {
        this.checkOrRequestPermission(requestCode,
                Manifest.permission.CAMERA,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }

    /**
     * 检查并请求权限
     * @param requestCode request code
     * @param permissions 权限
     */
    public void checkOrRequestPermission(int requestCode, String... permissions)
    {
        if (permissions == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            this.onPermissionGranted(requestCode);
            return;
        }

        int deniedNum = 0;
        String [] deniedPermissions = new String[permissions.length];
        for (String per : permissions) {
            if (ActivityCompat.checkSelfPermission(this, per) != PackageManager.PERMISSION_GRANTED) {
                deniedPermissions[deniedNum] = per;
                deniedNum += 1;
            }
        }

        if (deniedNum == 0) {
            this.onPermissionGranted(requestCode);
        }
        else {
            ActivityCompat.requestPermissions(this,
                    Arrays.copyOfRange(deniedPermissions, 0, deniedNum), requestCode);
        }
    }

    /**
     * 如果这个请求的所有权限都被 granted 了, 就会回调这个方法
     * @param requestCode request code
     */
    public void onPermissionGranted(int requestCode)
    {
        //
    }

    /**
     * 如果请求的所有权限中任何一个被 denied 了, 都会回调这个方法,
     * 并返回被 denied 掉的权限数组
     * @param requestCode request code
     * @param deniedPermissions denied 的权限
     */
    public void onPermissionDenied(int requestCode, @NonNull String [] deniedPermissions)
    {
        //
    }

    /**
     * 如果一个权限被设置为 Never Ask Again, 则会回调此方法
     * @param requestCode request code
     * @param neverAskPermissions 在这次请求中的所有被 never ask again 的权限
     */
    public void onPermissionNeverAskAgain(int requestCode, @NonNull String [] neverAskPermissions)
    {
        //
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        int deniedNum = 0;
        String [] deniedPermissions = new String[permissions.length];

        int neverAskNum = 0;
        String [] neverAskPermissions = new String[permissions.length];

        for (int i = 0; i < permissions.length; ++i) {
            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
                    neverAskPermissions[neverAskNum] = permissions[i];
                    neverAskNum += 1;
                }
                else {
                    deniedPermissions[deniedNum] = permissions[i];
                    deniedNum += 1;
                }
            }
        }

        if (neverAskNum != 0) {
            this.onPermissionNeverAskAgain(requestCode,
                    Arrays.copyOfRange(neverAskPermissions, 0, neverAskNum));
        }
        else if (deniedNum != 0) {
            this.onPermissionDenied(requestCode,
                    Arrays.copyOfRange(deniedPermissions, 0, deniedNum));
        }
        else {
            this.onPermissionGranted(requestCode);
        }
    }

使用

checkOrRequestStoragePermission(REQ_CREATE_APP_DIR);
重写那三个方法,做相应处理
@Override
    public void onPermissionGranted(int requestCode)
@Override
    public void onPermissionDenied(int requestCode, @NonNull String[] deniedPermissions)
    {
        alertPermissionSetting(requestCode,deniedPermissions);
    }



    @Override
    public void onPermissionNeverAskAgain(int requestCode, @NonNull String[] neverAskPermissions)
    {
        alertPermissionSetting(requestCode,neverAskPermissions);
    }
private void alertPermissionSetting(int requestCode, String[] permissions) {
        switch (requestCode) {
            case REQ_CREATE_APP_DIR:
                msg = String.format(getString(R.string.permission),getString(R.string.permission_file));
                break;

           
        }

        showAlertDialog(msg);
    }

    private AlertDialog mAlertDialog;
    private void showAlertDialog(String message) {
        if (mAlertDialog == null || !mAlertDialog.isShowing()) {
            mAlertDialog = new AlertDialog.Builder(this)
                    .setMessage(String.format(getString(R.string.permission_alert),message))
                    .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            intent.setData(Uri.parse("package:" + getPackageName()));
                            startActivityForResult(intent, ActionCodeUtil.PERMISSION_REQUEST_CODE);
                            return;
                        }
                    })
//                                .setNegativeButton("取消",null)
                    .create();
//            mAlertDialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
            mAlertDialog.setCancelable(false);
            mAlertDialog.show();
        }
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值