android 手动封装动态运行权限

android 6.0以后增加一个重要的适配,动态运行权限,之前我都是采用一些第三方库:PermissionsDispatcher;没啥大问题就是觉得膈应,闲了还是自己动手封装一下:

总体实现过程:

1,BaseActivity中加入权限判断以及申请。

2,需要权限的activity重写BaseActivity中onCall()方法来获得权限成功后要做的事情。

下面开始具体的实现的过程:

比如说我们先要获得相机这个权限:

1,清单文件中先申明。

android 手动封装动态运行权限_第1张图片
image

2,调用BaseActivity中的setPermission(String permission),方法,

3,重写BaseActivity的onCall(String permission)的方法。

android 手动封装动态运行权限_第2张图片
image

那么BaseActivity 中是如何封装的呢?

android 手动封装动态运行权限_第3张图片
image

申请权限的回调

  @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 0 || requestCode == 1){//requestCode = 0 表示申请单个重要权限  = 1 为同时申请多个权限 一般来说不太重要
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == -1){
                    if (shouldShowRequestPermissionRationale(permissions[i])) {
                        /**
                         * 用户拒绝后的操作,这里我们继续提醒用户申请权限(除非是特别特别重要的权限,否则不要这样做!)
                         */
                        if (requestCode == 0){
                            ActivityCompat.requestPermissions(this,new String[]{permissions[i]},0);
                        }else{
                            Toast.makeText(BaseActivity.this, "权限被拒绝: "+permissions[i], Toast.LENGTH_SHORT).show();
                        }

                    }else{
                        if (requestCode == 0){
                            /**
                             * 用户多次拒绝权限并设置了不再提醒,那么只能提醒用户去设置页面打开我们的权限了(除非是特别特别重要的权限,否则不要这样做!)
                             */
                            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                            builder.setTitle("说明");
                            builder.setMessage("没有权限将无法使用APP,打开设置页面放开权限");
                            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    /**
                                     * 这里使用了第三方库,用于打开应用的权限设置页面(有各种手机厂商的适配)
                                     *  author : Senh Linsh
                                     *  github : https://github.com/SenhLinsh
                                     */
                                    Utils.init(BaseActivity.this);
                                    IntentUtils.gotoPermissionSetting();
//                            Intent intent = new Intent();
//                            intent.setAction(Settings.ACTION_SETTINGS);
//                            startActivity(intent);
                                }
                            });
                            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Toast.makeText(BaseActivity.this, "无法使用APP", Toast.LENGTH_SHORT).show();
                                }
                            });
                            builder.show();
                        }else{
                            Toast.makeText(BaseActivity.this, "权限被拒绝: "+permissions[i], Toast.LENGTH_SHORT).show();
                        }
                    }
                }else if(requestCode == 0){
                    onCall(permissions[i]);
                }
            }

            if (requestCode == 1){
                onCall("");
            }
        }
        else{
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }

    }

这样就算是简单的封装完成啦~当然这里还有多权限申请的方法:

 /**
     * 检查多个申请权限
     * @param permissionsArray
     */
    public void setPermissionGroup(String[] permissionsArray){

        permissionsList = new ArrayList();
        if (Build.VERSION.SDK_INT>23){

            for (String permission : permissionsArray) {
                if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                    permissionsList.add(permission);
                }
            }

           if (permissionsList.size() == 0){
               onCall("");
           }else{
               ActivityCompat.requestPermissions(this, permissionsList.toArray(new String[permissionsList.size()]), 1);
           }


        }else{
            onCall("");
        }
    }

你可能感兴趣的:(android 手动封装动态运行权限)