package com.hdl.photovoltaic.utils; import android.app.Activity; import android.app.AppOpsManager; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.provider.Settings; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.hdl.photovoltaic.other.HdlDialogLogic; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.XXPermissions; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class PermissionUtils { /** * 获取权限成功 */ public static final int STATUS_SUCCESS = 0; /** * 申请权限拒绝, 但是下次申请权限还会弹窗 */ public static final int STATUS_REFUSE = 1; /** * 申请权限拒绝,并且是永久,不会再弹窗 */ public static final int STATUS_REFUSE_PERMANENT = 2; /** * 默认未请求授权状态 */ public static final int STATUS_DEFAULT = 3; /** * 只有activity才可以申请 * * @param activity - * @param strings - */ public static void activityPermission(Activity activity, String[] strings) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { List newList = new ArrayList<>(); for (String permission : strings) { boolean flag = checkPermission(activity, permission); if (!flag) { newList.add(permission); } } if (newList.size() > 0) { ActivityCompat.requestPermissions(activity, newList.toArray(new String[0]), STATUS_SUCCESS); } } } /** * 检查一个权限 * * @param activity - * @param permission - * @return - */ public static boolean checkPermission(Activity activity, String permission) { //first we need check this Drive has? CAMERA Permission return ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED; } /** * 检查一个权限 * * @param context - * @param permission - * @return - */ public static boolean checkPermission(Context context, String permission) { //first we need check this Drive has? CAMERA Permission return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED; } /** * 检查多个权限 * * @param activity - * @param strings -权限的数据 * @return - */ public static String[] checkPermission(Activity activity, String[] strings) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { List newList = new ArrayList<>(); for (String permission : strings) { boolean flag = checkPermission(activity, permission); if (!flag) { newList.add(permission); } } return newList.toArray(new String[0]); } return new String[]{}; } /** * 获取权限状态 */ public static int getPermissionState(Activity activity, String authorize) { int flag = ActivityCompat.checkSelfPermission(activity, authorize); boolean isShould = ActivityCompat.shouldShowRequestPermissionRationale(activity, authorize); if (isShould) { return STATUS_REFUSE; } if (flag == PackageManager.PERMISSION_GRANTED) { //获取到权限 return STATUS_SUCCESS; } if (!SharedPreUtils.contains(authorize)) { return STATUS_DEFAULT; } return STATUS_REFUSE_PERMANENT; } /** * 申请权限有回调 * * @param activity - * @param permission - * @param permissionStateCallback - * @param is_skip 拒绝权限后是否引导到设置那里打开(true=引导) */ public static void requestPermissionsResultCallback(Activity activity, String permission, PermissionState permissionStateCallback, boolean is_skip) { // String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE; int status = PermissionUtils.getPermissionState(activity, permission); switch (status) { case PermissionUtils.STATUS_SUCCESS: if (permissionStateCallback != null) { permissionStateCallback.Success(STATUS_SUCCESS); } break; case PermissionUtils.STATUS_REFUSE: case PermissionUtils.STATUS_DEFAULT: XXPermissions.with(activity).permission(permission).request(new OnPermissionCallback() { @Override public void onGranted(List permissions, boolean all) { SharedPreUtils.putBoolean(permission, true); if (permissionStateCallback != null) { permissionStateCallback.Success(STATUS_SUCCESS); } } @Override public void onDenied(List permissions, boolean never) { if (permissionStateCallback != null) { permissionStateCallback.Success(STATUS_REFUSE); } if (is_skip) { SharedPreUtils.putBoolean(permission, true); } } }); break; case PermissionUtils.STATUS_REFUSE_PERMANENT: // if (permissionStateCallback != null) { // permissionStateCallback.Success(STATUS_REFUSE_PERMANENT); // } if (permissionStateCallback != null) { permissionStateCallback.Success(STATUS_REFUSE_PERMANENT); } if (is_skip) { HdlDialogLogic.getInstance().showSettingPermissionDialog(activity); } break; } } public interface PermissionState { void Success(int value); } // 检查通知权限状态 public static boolean isNotificationEnabled(Context mContext) { if (mContext == null) { return false; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android 8.0 及以上版本 NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); return notificationManager.areNotificationsEnabled(); } else { // Android 7.1 及以下版本 AppOpsManager appOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); ApplicationInfo appInfo = mContext.getApplicationInfo(); String packageName = mContext.getApplicationContext().getPackageName(); int uid = appInfo.uid; try { Class appOpsClass = Class.forName(AppOpsManager.class.getName()); Method checkOpNoThrowMethod = appOpsClass.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE, String.class); Field opPostNotificationValue = appOpsClass.getDeclaredField("OP_POST_NOTIFICATION"); int value = (int) opPostNotificationValue.get(Integer.class); return ((int) checkOpNoThrowMethod.invoke(appOps, value, uid, packageName) == AppOpsManager.MODE_ALLOWED); } catch (Exception e) { e.printStackTrace(); return true; } } } // 打开通知权限设置页面 public static void openNotificationSettings(Context mContext) { if (mContext == null) { return; } Intent intent = new Intent(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android 8.0 及以上版本 intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, mContext.getPackageName()); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android 5.0 及以上版本 intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", mContext.getPackageName()); intent.putExtra("app_uid", mContext.getApplicationInfo().uid); } else { // Android 5.0 以下版本 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + mContext.getPackageName())); } mContext.startActivity(intent); } }