89.android 简单的动态权限申请

 //第一步 manifest:

 

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

//第二步 第三方库依赖:

//2.申请权限三方依赖库
    implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'

//第三步 工具类:

/**
 * 申请权限相关工具类
 *
 * @author CJF
 */
public class PermissionUtil {
    private final String TAG = "PermissionUtil";
    private volatile static PermissionUtil permissionUtil = null;

    /**
     * 录音权限
     */
    private final String recordAudio = Manifest.permission.RECORD_AUDIO;

    /**
     * 读取外部存储权限
     */
    private final String readExternalStorage = Manifest.permission.READ_EXTERNAL_STORAGE;

    /**
     * 写入外部存储权限
     */
    private final String writeExternalStorage = Manifest.permission.WRITE_EXTERNAL_STORAGE;

    /**
     * 获取粗略位置权限
     */
    private final String coarseLocation = Manifest.permission.ACCESS_COARSE_LOCATION;

    /**
     * 获取精确位置权限
     */
    private final String fineLocation = Manifest.permission.ACCESS_FINE_LOCATION;

    /**
     * 获取精确位置权限
     */
    private final String callPhone = Manifest.permission.CALL_PHONE;

    /**
     * 权限数组
     */
//    private final String[] permissions = {recordAudio, readExternalStorage, writeExternalStorage, coarseLocation, fineLocation};
    private final String[] permissions = {callPhone};

    /**
     * 弹窗
     */
    private SelectDialog selectDialog;

    private AppCompatActivity activity;

    public static PermissionUtil getInstance() {
        if (null == permissionUtil) {
            synchronized (PermissionUtil.class) {
                if (null == permissionUtil) {
                    permissionUtil = new PermissionUtil();
                }
            }
        }
        return permissionUtil;
    }

    /**
     * 逐个申请权限
     * 申请权限 每次单个申请
     */
    public void requestSinglePermission(AppCompatActivity activity) {
        this.activity = activity;
        //判断权限是否已经全部拥有
        if (isPermissionGranted(activity)) {
            Log.d(TAG, "权限全部拥有 return");
            //关闭弹窗
            if (null != selectDialog && selectDialog.isShowing()) {
                selectDialog.cancel();
            }
            return;
        }

        //申请权限三方库
        RxPermissions rxPermissions = new RxPermissions(activity);
        //申请权限
        for (String permission : permissions) {
            boolean isGranted = rxPermissions.isGranted(permission);
            if (!isGranted) {
                rxPermissions.requestEach(permission).subscribe(new Observer<Permission>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Permission permission) {
                        String name = permission.name;
                        boolean granted = permission.granted;
                        Log.d(TAG, "申请" + name + ":" + granted);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        boolean granted = rxPermissions.isGranted(permission);
                        if (granted) {
                            requestSinglePermission(activity);
                        } else {
                            //关闭弹窗
                            if (null != selectDialog && selectDialog.isShowing()) {
                                selectDialog.cancel();
                            }
                            //获取权限名称
                            String permissionName = getPermissionName(permission);
                            selectDialog = new SelectDialog(activity, "请同意" + permissionName + "权限,否则影响使用", new SelectDialog.DialogListen() {
                                @Override
                                public void onClickOk(SelectDialog dialog) {
                                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    intent.setData(Uri.parse("package:" + activity.getPackageName()));
                                    activity.startActivity(intent);
                                }

                                @Override
                                public void onClickCancel(SelectDialog dialog) {
                                    requestSinglePermission(activity);
                                }
                            });
                        }
                    }
                });
                return;
            }
        }

        Log.d(TAG, "1111");
    }

    /**
     * 一次申请多个权限
     * 申请权限 数组多个申请
     */
    public void requestMultiplePermissions(AppCompatActivity activity) {
        this.activity = activity;
        //判断权限是否已经全部拥有
        if (isPermissionGranted(activity)) {
            Log.d(TAG, "权限全部拥有 return");
            return;
        }

        //申请权限三方库
        RxPermissions rxPermissions = new RxPermissions(activity);
        //申请权限
        rxPermissions.requestEach(permissions).subscribe(new Observer<Permission>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Permission permission) {
                String name = permission.name;
                boolean granted = permission.granted;
                Log.d(TAG, "申请" + name + ":" + granted);

                if (!granted) {
                    //关闭弹窗
                    if (null != selectDialog && selectDialog.isShowing()) {
                        selectDialog.cancel();
                    }
                    //获取权限名称
                    String permissionName = getPermissionName(name);
                    selectDialog = new SelectDialog(activity, "请同意" + permissionName + "权限,否则影响使用", new SelectDialog.DialogListen() {
                        @Override
                        public void onClickOk(SelectDialog dialog) {
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            intent.setData(Uri.parse("package:" + activity.getPackageName()));
                            activity.startActivity(intent);
                        }

                        @Override
                        public void onClickCancel(SelectDialog dialog) {
                            requestMultiplePermissions(activity);
                        }
                    });
                }
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {
                if (isPermissionGranted(activity)) {
                    Log.d(TAG, "权限全部拥有");
                    //关闭弹窗
                    if (null != selectDialog && selectDialog.isShowing()) {
                        selectDialog.cancel();
                    }
                }
            }
        });

        Log.d(TAG, "1111");
    }

    /**
     * 判断权限是否已经全部拥有
     *
     * @param activity
     * @return
     */
    public boolean isPermissionGranted(AppCompatActivity activity) {
        RxPermissions rxPermissions = new RxPermissions(activity);
        for (String permission : permissions) {
            if (!rxPermissions.isGranted(permission)) {
                Log.d(TAG, "权限不完整");
                return false;
            }
        }
        Log.d(TAG, "权限全部拥有");
        return true;
    }

    /**
     * 判断权限是否已经全部拥有
     *
     * @param context
     * @return
     */
    public boolean isPermissionGranted(Context context) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                Log.e(TAG, "权限不完整");
                return false;
            }
        }
        Log.d(TAG, "权限全部拥有");
        return true;
    }

    /**
     * 获取权限名称
     *
     * @param permission
     * @return
     */
    private String getPermissionName(String permission) {
        switch (permission) {
            case recordAudio:
                return "录音";
            case readExternalStorage:
            case writeExternalStorage:
                return "读写";
            case coarseLocation:
            case fineLocation:
                return "定位";
            default:
                return "";
        }
    }

}

//第四步 调用:

PermissionUtil.getInstance().requestMultiplePermissions(this);

 

 //--------------------------------------------------------------------完---------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值