android 6.0动态添加权限

来源:互联网 发布:linux samba 端口修改 编辑:程序博客网 时间:2024/05/08 00:05

一、这些在父类中添加

  
  private PermissionListener mlistener;

/**
     * Created by pangzhenzhong on 2017/9/20.
     * 权限回调接口(可以自己命名)
     */


    public interface PermissionListener {


        //授权成功进入的方法
        void onGranted();


        //授权部分(集合授权成功进入的方法)
        void onGranted(List<String> grantedPermission);


        //拒绝授权
        void onDenied(List<String> deniedPermission);
    }




    /**
     * 权限申请
     * @param permissions 待申请的权限集合
     * @param listener  申请结果监听事件
     */
    protected void requestRunTimePermission(String[] permissions,PermissionListener listener){
        this.mlistener = listener;


        //存放授权的权限
        List<String> permissionList = new ArrayList<>();
        //遍历权限集合
        for (String permission : permissions) {
            //判断是否已经授权
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                //未授权,则加入待授权的权限集合中
                permissionList.add(permission);
            }
        }


        //判断集合
        if (!permissionList.isEmpty()){  //如果集合不为空,则需要去授权
            ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), 1);
        }else{  //为空,则已经全部授权
            listener.onGranted();
        }
    }


    /**
     * 权限申请结果
     * @param requestCode  请求码
     * @param permissions  所有的权限集合
     * @param grantResults 授权结果集合
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0){
                    //被用户拒绝的权限集合
                    List<String> deniedPermissions = new ArrayList<>();
                    //用户通过的权限集合
                    List<String> grantedPermissions = new ArrayList<>();
                    for (int i = 0; i < grantResults.length; i++) {
                        //获取授权结果,这是一个int类型的值
                        int grantResult = grantResults[i];


                        if (grantResult != PackageManager.PERMISSION_GRANTED){ //用户拒绝授权的权限
                            String permission = permissions[i];
                            deniedPermissions.add(permission);
                        }else{  //用户同意的权限
                            String permission = permissions[i];
                            grantedPermissions.add(permission);
                        }
                    }


                    if (deniedPermissions.isEmpty()){  //用户拒绝权限为空
                        mlistener.onGranted();
                    }else {  //不为空
                        //回调授权成功的接口
                        mlistener.onDenied(deniedPermissions);
                        //回调授权失败的接口
                        mlistener.onGranted(grantedPermissions);
                    }
                }
                break;
            default:
                break;
        }
    }


二、在需要用到授权的activity中使用:

     //获取权限
    private void requestPermission() {
        requestRunTimePermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}
                , new PermissionListener() {
            @Override
            public void onGranted() {  //所有权限授权成功
               do someting....(调用你自己需要的处理代码,也就是你授权成功后,需要处理的事情)
            }


            @Override
            public void onGranted(List<String> grantedPermission) { //授权失败权限集合
                Toast.makeText(getActivity(), "授权失败", Toast.LENGTH_SHORT).show();
            }


            @Override
            public void onDenied(List<String> deniedPermission) { //授权成功权限集合
                showSelector();
            }
        });
    }



原创粉丝点击