| | |
| | | package com.hdl.photovoltaic.utils; |
| | | |
| | | import android.Manifest; |
| | | 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.R; |
| | | import com.hdl.photovoltaic.other.HdlThreadLogic; |
| | | 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 static int getAuthorizeStaus(Activity activity, String authorize) { |
| | | public static int getPermissionState(Activity activity, String authorize) { |
| | | int flag = ActivityCompat.checkSelfPermission(activity, authorize); |
| | | Boolean isShould = ActivityCompat.shouldShowRequestPermissionRationale(activity, authorize); |
| | | boolean isShould = ActivityCompat.shouldShowRequestPermissionRationale(activity, authorize); |
| | | if (isShould) { |
| | | return STATUS_REFUSE; |
| | | } |
| | |
| | | * @param activity - |
| | | * @param permission - |
| | | * @param permissionStateCallback - |
| | | * @param is_skip 拒绝权限后是否引导到设置那里打开(true=引导) |
| | | */ |
| | | public static void applyForRight(Activity activity, String permission, PermissionState permissionStateCallback) { |
| | | public static void requestPermissionsResultCallback(Activity activity, String permission, PermissionState permissionStateCallback, boolean is_skip) { |
| | | // String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE; |
| | | int status = PermissionUtils.getAuthorizeStaus(activity, permission); |
| | | int status = PermissionUtils.getPermissionState(activity, permission); |
| | | switch (status) { |
| | | case PermissionUtils.STATUS_SUCCESS: |
| | | if (permissionStateCallback != null) { |
| | |
| | | break; |
| | | case PermissionUtils.STATUS_REFUSE: |
| | | case PermissionUtils.STATUS_DEFAULT: |
| | | XXPermissions.with(activity) |
| | | .permission(permission) |
| | | .request(new OnPermissionCallback() { |
| | | @Override |
| | | public void onGranted(List<String> permissions, boolean all) { |
| | | SharedPreUtils.putBoolean(permission, true); |
| | | if (permissionStateCallback != null) { |
| | | permissionStateCallback.Success(STATUS_REFUSE); |
| | | } |
| | | } |
| | | XXPermissions.with(activity).permission(permission).request(new OnPermissionCallback() { |
| | | @Override |
| | | public void onGranted(List<String> permissions, boolean all) { |
| | | SharedPreUtils.putBoolean(permission, true); |
| | | if (permissionStateCallback != null) { |
| | | permissionStateCallback.Success(STATUS_REFUSE); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void onDenied(List<String> permissions, boolean never) { |
| | | SharedPreUtils.putBoolean(permission, true); |
| | | } |
| | | }); |
| | | @Override |
| | | public void onDenied(List<String> permissions, boolean never) { |
| | | 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 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); |
| | | } |
| | | |
| | | |
| | | } |