优化:细化权限请求判断
parent
5cf31b5b28
commit
146e5b725d
@ -0,0 +1,282 @@
|
||||
package com.idormy.sms.forwarder.utils;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.hjq.permissions.IPermissionInterceptor;
|
||||
import com.hjq.permissions.OnPermissionCallback;
|
||||
import com.hjq.permissions.Permission;
|
||||
import com.hjq.permissions.XXPermissions;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import com.idormy.sms.forwarder.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* author : Android 轮子哥
|
||||
* github : https://github.com/getActivity/XXPermissions
|
||||
* time : 2021/01/04
|
||||
* desc : 权限申请拦截器
|
||||
*/
|
||||
@SuppressWarnings({"deprecation", "CommentedOutCode"})
|
||||
public final class PermissionInterceptor implements IPermissionInterceptor {
|
||||
|
||||
// @Override
|
||||
// public void requestPermissions(Activity activity, OnPermissionCallback callback, List<String> allPermissions) {
|
||||
// // 这里的 Dialog 只是示例,没有用 DialogFragment 来处理 Dialog 生命周期
|
||||
// new AlertDialog.Builder(activity)
|
||||
// .setTitle(R.string.common_permission_hint)
|
||||
// .setMessage(R.string.common_permission_message)
|
||||
// .setPositiveButton(R.string.common_permission_granted, new DialogInterface.OnClickListener() {
|
||||
//
|
||||
// @Override
|
||||
// public void onClick(DialogInterface dialog, int which) {
|
||||
// dialog.dismiss();
|
||||
// PermissionFragment.beginRequest(activity, new ArrayList<>(allPermissions), PermissionInterceptor.this, callback);
|
||||
// }
|
||||
// })
|
||||
// .setNegativeButton(R.string.common_permission_denied, new DialogInterface.OnClickListener() {
|
||||
//
|
||||
// @Override
|
||||
// public void onClick(DialogInterface dialog, int which) {
|
||||
// dialog.dismiss();
|
||||
// }
|
||||
// })
|
||||
// .show();
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void grantedPermissions(Activity activity, List<String> allPermissions, List<String> grantedPermissions,
|
||||
boolean all, OnPermissionCallback callback) {
|
||||
if (callback != null) {
|
||||
callback.onGranted(grantedPermissions, all);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
@Override
|
||||
public void deniedPermissions(Activity activity, List<String> allPermissions, List<String> deniedPermissions,
|
||||
boolean never, OnPermissionCallback callback) {
|
||||
if (callback != null) {
|
||||
callback.onDenied(deniedPermissions, never);
|
||||
}
|
||||
|
||||
if (never) {
|
||||
showPermissionDialog(activity, deniedPermissions);
|
||||
return;
|
||||
}
|
||||
|
||||
if (deniedPermissions.size() == 1 && Permission.ACCESS_BACKGROUND_LOCATION.equals(deniedPermissions.get(0))) {
|
||||
ToastUtils.show(R.string.common_permission_fail_4);
|
||||
return;
|
||||
}
|
||||
|
||||
ToastUtils.show(R.string.common_permission_fail_1);
|
||||
|
||||
if (callback == null) {
|
||||
return;
|
||||
}
|
||||
callback.onDenied(deniedPermissions, never);
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示授权对话框
|
||||
*/
|
||||
protected void showPermissionDialog(Activity activity, List<String> permissions) {
|
||||
// 这里的 Dialog 只是示例,没有用 DialogFragment 来处理 Dialog 生命周期
|
||||
new AlertDialog.Builder(activity)
|
||||
.setTitle(R.string.common_permission_alert)
|
||||
.setCancelable(false)
|
||||
.setMessage(getPermissionHint(activity, permissions))
|
||||
.setPositiveButton(R.string.common_permission_goto, (dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
XXPermissions.startPermissionActivity(activity, permissions);
|
||||
})
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据权限获取提示
|
||||
*/
|
||||
protected String getPermissionHint(Context context, List<String> permissions) {
|
||||
if (permissions == null || permissions.isEmpty()) {
|
||||
return context.getString(R.string.common_permission_fail_2);
|
||||
}
|
||||
|
||||
List<String> hints = new ArrayList<>();
|
||||
for (String permission : permissions) {
|
||||
switch (permission) {
|
||||
case Permission.READ_EXTERNAL_STORAGE:
|
||||
case Permission.WRITE_EXTERNAL_STORAGE:
|
||||
case Permission.MANAGE_EXTERNAL_STORAGE: {
|
||||
String hint = context.getString(R.string.common_permission_storage);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.CAMERA: {
|
||||
String hint = context.getString(R.string.common_permission_camera);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.RECORD_AUDIO: {
|
||||
String hint = context.getString(R.string.common_permission_microphone);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.ACCESS_FINE_LOCATION:
|
||||
case Permission.ACCESS_COARSE_LOCATION:
|
||||
case Permission.ACCESS_BACKGROUND_LOCATION: {
|
||||
String hint;
|
||||
if (!permissions.contains(Permission.ACCESS_FINE_LOCATION) &&
|
||||
!permissions.contains(Permission.ACCESS_COARSE_LOCATION)) {
|
||||
hint = context.getString(R.string.common_permission_location_background);
|
||||
} else {
|
||||
hint = context.getString(R.string.common_permission_location);
|
||||
}
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.BLUETOOTH_SCAN:
|
||||
case Permission.BLUETOOTH_CONNECT:
|
||||
case Permission.BLUETOOTH_ADVERTISE: {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
String hint = context.getString(R.string.common_permission_bluetooth);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_PHONE_STATE:
|
||||
case Permission.CALL_PHONE:
|
||||
case Permission.ADD_VOICEMAIL:
|
||||
case Permission.USE_SIP:
|
||||
case Permission.READ_PHONE_NUMBERS:
|
||||
case Permission.ANSWER_PHONE_CALLS: {
|
||||
String hint = context.getString(R.string.common_permission_phone);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.GET_ACCOUNTS:
|
||||
case Permission.READ_CONTACTS:
|
||||
case Permission.WRITE_CONTACTS: {
|
||||
String hint = context.getString(R.string.common_permission_contacts);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_CALENDAR:
|
||||
case Permission.WRITE_CALENDAR: {
|
||||
String hint = context.getString(R.string.common_permission_calendar);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.READ_CALL_LOG:
|
||||
case Permission.WRITE_CALL_LOG:
|
||||
case Permission.PROCESS_OUTGOING_CALLS: {
|
||||
String hint = context.getString(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ?
|
||||
R.string.common_permission_call_log : R.string.common_permission_phone);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.BODY_SENSORS: {
|
||||
String hint = context.getString(R.string.common_permission_sensors);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.ACTIVITY_RECOGNITION: {
|
||||
String hint = context.getString(R.string.common_permission_activity_recognition);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.SEND_SMS:
|
||||
case Permission.RECEIVE_SMS:
|
||||
case Permission.READ_SMS:
|
||||
case Permission.RECEIVE_WAP_PUSH:
|
||||
case Permission.RECEIVE_MMS: {
|
||||
String hint = context.getString(R.string.common_permission_sms);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.REQUEST_INSTALL_PACKAGES: {
|
||||
String hint = context.getString(R.string.common_permission_install);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.SYSTEM_ALERT_WINDOW: {
|
||||
String hint = context.getString(R.string.common_permission_window);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.WRITE_SETTINGS: {
|
||||
String hint = context.getString(R.string.common_permission_setting);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.NOTIFICATION_SERVICE: {
|
||||
String hint = context.getString(R.string.common_permission_notification);
|
||||
if (!hints.contains(hint)) {
|
||||
hints.add(hint);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Permission.PACKAGE_USAGE_STATS: {
|
||||
String hint = context.getString(R.string.common_permission_task);
|
||||
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 context.getString(R.string.common_permission_fail_3, builder.toString());
|
||||
}
|
||||
|
||||
return context.getString(R.string.common_permission_fail_2);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue