美文网首页
Android6.0权限管理

Android6.0权限管理

作者: 飞奔吧牛牛 | 来源:发表于2018-09-14 11:16 被阅读0次
    自Android6.0后,一些敏感权限需要在程序运行时手动申请。网上的介绍和教程已经很丰富,现在在此简单记录一下。

    使用的手机:荣耀note8

    API:

    检查有没有某个权限

    ContextCompat.checkSelfPermission(Context context, String permission);

    权限名字(以相机权限为例)

    Manifest.permission.CAMERA

    有权限

    PackageManager.PERMISSION_GRANTED

    无权限

    PackageManager.PERMISSION_DENIED

    申请多个权限

    ActivityCompat.requestPermissions(Activity activity,String[] permissions, int requestCode);

    申请权限的回调方法

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

    检查是否需要给用户提示(好奇怪的方法,下文在说)

    ActivityCompat.shouldShowRequestPermissionRationale(Activity activity, String permission)

    使用

    以拍照保存照片为例,我们所需的权限有
    拍照权限:CAMERA
    读写存储权限:WRITE_EXTERNAL_STORAGE

    private void initPermissions() {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
                    || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                //申请权限
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CAMERA_PRIMISSIONS_REQUEST_CODE);
            } else {
                if (hasSdcard()) {
                     //TODO 拍照
                } else {
                    Toast.makeText(this, "无SD卡!", Toast.LENGTH_SHORT).show();
                }
            }
        }
    

    回调

    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case CAMERA_PRIMISSIONS_REQUEST_CODE:
                    boolean agreeCamera = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean agreeStorage = grantResults[1] == PackageManager.PERMISSION_GRANTED;
                    if (agreeCamera && agreeStorage) {
                        //两个权限都同意
                        //TODO 拍照
    
                    } else {//有一个不同意
                        Toast.makeText(this, "您有权限未允许,无法拍照", Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
                    break;
            }
        }
    

    先检查有没有相应的权限,没有就申请,有就去拍照。
    申请权限后,检查对应的权限有没有被同意,都同意了,则去拍照,否者就给出提示。
    结果:
    1.当都同意后,以后检查权限后不会弹出提示。
    2.若有权限未被同意,则,下次检查申请权限时,还会弹出提示。
    3.问题来了,如果用户看到弹出的权限提示时,选择了禁止后不再弹出提示选项,那再次申请时就不会弹出提示。这时候用户点击拍照,但是系统未弹出权限提示框。这时ActivityCompat.shouldShowRequestPermissionRationale(Activity activity, String permission)方法就派上用场了。

    if (agreeCamera && agreeStorage) {
        //两个权限都同意
        //TODO 拍照
    
    } else {//至少有一个不同意
        Toast.makeText(this, "您有权限未允许,无法拍照", Toast.LENGTH_SHORT).show();
        //拍照,内存,如果有权限被选择禁止后不再询问,那么系统就不会弹出提示了,这时需要手动弹出dialog,让用户手动设置
        // 1.同意后为false 2.禁止后为true 3.禁止并选择禁止后不再询问为false
        boolean showCamera = ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA);
        boolean showExternal = ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        //选择了禁止后不再询问选项,系统没有弹出询问框,需要提示手动设置
        if (!showCamera || !showExternal) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("设置")
                    .setMessage("App需要您的的拍照和存储权限,请手动打开后再操作。")
                    .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) {
                            new PermissionPageUtils(Main2Activity.this).jumpPermissionPage();
                        }
                    });
            builder.create().show();
        } else {
            Toast.makeText(this, "您有权限未允许,无法拍照", Toast.LENGTH_SHORT).show();
        }
    } 
    

    据说有些手机跳转到系统权限设置界面会有问题。在网上我找了一些解决方法。
    http://blog.csdn.net/donkor_/article/details/79374442
    https://www.jianshu.com/p/58c6ca8173c4

    相关文章

      网友评论

          本文标题:Android6.0权限管理

          本文链接:https://www.haomeiwen.com/subject/xxasgftx.html