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ù)。