RxPermissions權(quán)限請求

package com.example.core.permission;

import android.os.Build;

import com.tbruyelle.rxpermissions3.RxPermissions;

import java.util.ArrayList;
import java.util.List;



/**
 * ================================================
 * 權(quán)限請求工具類
 * ================================================
 */
public class PermissionUtil {
    public static final String TAG = "Permission";

    private PermissionUtil() {
        throw new IllegalStateException("you can't instantiate me!");
    }

    public static void requestPermission(DefaultPermissionObserver observer, RxPermissions rxPermissions, String... permissions) {
        if (permissions == null || permissions.length == 0) {
            return;
        }

        List<String> needRequest = new ArrayList<>();
        for (String permission : permissions) { //過濾調(diào)已經(jīng)申請過的權(quán)限
            if (!rxPermissions.isGranted(permission)) {
                needRequest.add(permission);
            }
        }

        if (needRequest.isEmpty()) {//全部權(quán)限都已經(jīng)申請過,直接執(zhí)行操作
            observer.onRequestPermissionSuccess();
        } else {//沒有申請過,則開始申請
            rxPermissions
                    .requestEach(needRequest.toArray(new String[0]))
                    .buffer(permissions.length)
                    .subscribe(observer);
        }
    }

    /**
     * 獲取權(quán)限失敗時得到相應(yīng)權(quán)限的消息
     * @param permissions 權(quán)限組
     * @return 消息
     */
    public static String getPermissionHint(List<String> permissions) {
        if (permissions == null || permissions.isEmpty()) {
            return "獲取權(quán)限失敗,請手動授予權(quán)限";
        }
        List<String> hints = new ArrayList<>();
        for (String permission : permissions) {
            switch (permission) {
                case Permissions.READ_EXTERNAL_STORAGE:
                case Permissions.WRITE_EXTERNAL_STORAGE:
                case Permissions.MANAGE_EXTERNAL_STORAGE: {
                    String hint = "存儲權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.CAMERA: {
                    String hint = "相機(jī)權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.RECORD_AUDIO: {
                    String hint = "麥克風(fēng)權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.ACCESS_FINE_LOCATION:
                case Permissions.ACCESS_COARSE_LOCATION:
                case Permissions.ACCESS_BACKGROUND_LOCATION: {
                    String hint;
                    if (!permissions.contains(Permissions.ACCESS_FINE_LOCATION) &&
                            !permissions.contains(Permissions.ACCESS_COARSE_LOCATION)) {
                        hint = "后臺定位權(quán)限";
                    } else {
                        hint = "定位權(quán)限";
                    }
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.READ_PHONE_STATE:
                case Permissions.CALL_PHONE:
                case Permissions.ADD_VOICEMAIL:
                case Permissions.USE_SIP:
                case Permissions.READ_PHONE_NUMBERS:
                case Permissions.ANSWER_PHONE_CALLS: {
                    String hint = "電話權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.GET_ACCOUNTS:
                case Permissions.READ_CONTACTS:
                case Permissions.WRITE_CONTACTS: {
                    String hint = "通訊錄權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.READ_CALENDAR:
                case Permissions.WRITE_CALENDAR: {
                    String hint = "日歷權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.READ_CALL_LOG:
                case Permissions.WRITE_CALL_LOG:
                case Permissions.PROCESS_OUTGOING_CALLS: {
                    String hint = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ?
                            "通話記錄權(quán)限" : "電話權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.BODY_SENSORS: {
                    String hint = "身體傳感權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.ACTIVITY_RECOGNITION: {
                    String hint = "健身運動權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.SEND_SMS:
                case Permissions.RECEIVE_SMS:
                case Permissions.READ_SMS:
                case Permissions.RECEIVE_WAP_PUSH:
                case Permissions.RECEIVE_MMS: {
                    String hint = "短信權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.REQUEST_INSTALL_PACKAGES: {
                    String hint = "安裝應(yīng)用權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.NOTIFICATION_SERVICE: {
                    String hint = "通知欄權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.SYSTEM_ALERT_WINDOW: {
                    String hint = "懸浮窗權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                case Permissions.WRITE_SETTINGS: {
                    String hint = "系統(tǒng)設(shè)置權(quán)限";
                    if (!hints.contains(hint)) {
                        hints.add(hint);
                    }
                    break;
                }
                default:
                    break;
            }
        }

        if (!hints.isEmpty()) {
            StringBuilder builder = new StringBuilder();
            for (String text : hints) {
                if (builder.length() == 0) {
                    builder.append(text);
                } else {
                    builder.append("、")
                            .append(text);
                }
            }
            builder.append(" ");
            return builder.toString();
        }
        return "";
    }

}


package com.example.core.permission;


import com.tbruyelle.rxpermissions3.Permission;

import java.util.ArrayList;
import java.util.List;

import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;

/**
 * 權(quán)限申請統(tǒng)一監(jiān)聽
 */
public abstract class DefaultPermissionObserver implements Observer<List<Permission>> {

    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull List<Permission> permissions) {
        List<String> failurePermissions = new ArrayList<>();
        List<String> askNeverAgainPermissions = new ArrayList<>();
        for (Permission permission : permissions) {
            if(permission.granted){
                //用戶同意授權(quán)
                onRequestPermissionSuccess();

            }else if(permission.shouldShowRequestPermissionRationale){
                //用戶拒絕授權(quán)但未勾選了”不再詢問“
                failurePermissions.add(permission.name);
            }else {
                //用戶拒絕授權(quán)并勾選了”不再詢問“
                askNeverAgainPermissions.add(permission.name);
            }
        }
        if (failurePermissions.size() > 0) {
            onRequestPermissionFailure(failurePermissions);
        }

        if (askNeverAgainPermissions.size() > 0) {
            onRequestPermissionFailureWithAskNeverAgain(askNeverAgainPermissions);
        }

        if (failurePermissions.size() == 0 && askNeverAgainPermissions.size() == 0) {
            onRequestPermissionSuccess();
        }
    }

    @Override
    public void onError(@NonNull Throwable e) {

    }

    @Override
    public void onComplete() {

    }

    //獲取權(quán)限成功,處理業(yè)務(wù)
    public abstract void onRequestPermissionSuccess();
    public abstract void onRequestPermissionFailure(List<String> permissions);
    public abstract void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions);
}

如果還想更簡潔一點

package com.example.demo.permission;


import android.content.Context;

import com.example.common.util.IntentUtils;
import com.example.core.permission.DefaultPermissionObserver;
import com.example.core.permission.PermissionUtil;
import com.example.ext.dialog.MessageDialog;

import java.util.List;


/**
 * 權(quán)限申請統(tǒng)一監(jiān)聽
 */
public abstract class PermissionObserver extends DefaultPermissionObserver {
    @Override
    public void onRequestPermissionFailure(List<String> permissions) {
                    new MessageDialog.Builder(getContext())
                    .setTitle("權(quán)限請求")
                    .setMessage("使用該功能需要" + PermissionUtil.getPermissionHint(permissions)+",請點擊\"確定\"繼續(xù)授權(quán)")
                    .setConfirm("確定")
                    .setListener(dialog -> IntentUtils.gotoPermission(getContext()))
                    .show();
    }

    @Override
    public void onRequestPermissionFailureWithAskNeverAgain(List<String> permissions) {
            new MessageDialog.Builder(getContext())
                    .setTitle("權(quán)限請求")
                    .setMessage("權(quán)限未開啟,請手動授予" + PermissionUtil.getPermissionHint(permissions))
                    .setConfirm("去開啟")
                    .setListener(dialog -> IntentUtils.gotoPermission(getContext()))
                    .show();
    }

    public abstract Context getContext();
}

使用

PermissionUtil.requestPermission(new PermissionObserver() {

                    @Override
                    public void onRequestPermissionSuccess() {
                        new MessageDialog.Builder(getContext())
                                .setTitle("權(quán)限請求")
                                .setMessage("權(quán)限已通過,執(zhí)行業(yè)務(wù)")
                                .setListener(dialog -> IntentUtils.gotoPermission(getContext()))
                                .show();
                    }
                    @Override
                    public Context getContext() {
                        return HomeFragment.this.getContext();
                    }
                }, new RxPermissions(this), Manifest.permission.CAMERA);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容