From b2340ac4ce1c9ea2070c0e7fb72a03fb2b2500ad Mon Sep 17 00:00:00 2001
From: wjc <1243177876@qq.com>
Date: 星期四, 19 三月 2026 15:27:32 +0800
Subject: [PATCH] 2026年03月19日15:27:21 蓝牙开发中

---
 app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java |  227 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 221 insertions(+), 6 deletions(-)

diff --git a/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java b/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java
index c970410..d71c332 100644
--- a/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java
+++ b/app/src/main/java/com/hdl/photovoltaic/utils/PermissionUtils.java
@@ -1,24 +1,49 @@
 package com.hdl.photovoltaic.utils;
 
 import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.AppOpsManager;
+import android.app.Application;
+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 androidx.fragment.app.Fragment;
 
+import com.hdl.photovoltaic.HDLApp;
+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.Arrays;
 import java.util.List;
 
 
 public class PermissionUtils {
-
     /**
      * 鑾峰彇鏉冮檺鎴愬姛
      */
-    public static final int STATUS_SUCCESS = 1;
+    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鎵嶅彲浠ョ敵璇�
@@ -26,7 +51,7 @@
      * @param activity -
      * @param strings  -
      */
-    public static void askPermission(Activity activity, String[] strings) {
+    public static void activityPermission(Activity activity, String[] strings) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             List<String> newList = new ArrayList<>();
             for (String permission : strings) {
@@ -54,10 +79,22 @@
     }
 
     /**
+     * 妫�鏌ヤ竴涓潈闄�
+     *
+     * @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  -
+     * @param strings  -鏉冮檺鐨勬暟鎹�
      * @return -
      */
     public static String[] checkPermission(Activity activity, String[] strings) {
@@ -74,5 +111,183 @@
         return new String[]{};
     }
 
+    /**
+     * 鑾峰彇鏉冮檺鐘舵��
+     */
+    public static int getPermissionState(Activity activity, String authorize) {
+        int flag = ActivityCompat.checkSelfPermission(activity, authorize);
+        //姝ゆ椂闇�瑕佸垽鏂槸鍚︽槸"姘镐箙鎷掔粷"
+        //褰撳墠isShould =false锛�
+        // 姘镐箙鎷掔粷锛堢敤鎴峰嬀閫変簡"涓嶅啀璇㈤棶"锛�
+        // 鎴栬�呮槸鍦ㄦ煇浜涚壒娈婂満鏅笅锛堝璁惧绛栫暐闄愬埗锛�
+        // 杩欑鎯呭喌鍐嶆 requestPermissions() 涔熶笉浼氬脊绐楋紝蹇呴』寮曞鐢ㄦ埛鍘昏缃〉闈㈡墜鍔ㄥ紑鍚�
+        //褰撳墠isShould =true锛�
+        // 鏅�氭嫆缁濓紙鐢ㄦ埛鍙槸鐐逛簡鎷掔粷锛屾病鏈夊嬀閫�"涓嶅啀璇㈤棶"锛�
+        // 杩欑鎯呭喌鍐嶆 requestPermissions() 杩樹細寮圭獥
+        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 authorize 鏉冮檺鍚嶇О
+     * @return 锛�0=鎺堜簣鏉冮檺锛�1=鏅�氭嫆缁濓紙鐢ㄦ埛鍙槸鐐逛簡鎷掔粷锛屾病鏈夊嬀閫�"涓嶅啀璇㈤棶"锛夛紱2=姘镐箙鎷掔粷锛堢敤鎴峰嬀閫変簡"涓嶅啀璇㈤棶"锛夛紱3=棣栨鐢宠锛�
+     */
+    public static int getPermissionStateV2(Activity activity, String authorize) {
+        int flag = ActivityCompat.checkSelfPermission(activity, authorize);
+        // 鎯呭喌 1: 鐢ㄦ埛鎺堜簣鏉冮檺
+        if (flag == PackageManager.PERMISSION_GRANTED) {
+            //鑾峰彇鍒版潈闄�
+            return STATUS_SUCCESS;
+        }
+        if (!SharedPreUtils.contains(authorize)) {
+            SharedPreUtils.putBoolean(authorize, true);
+            //棣栨鐢宠
+            return STATUS_DEFAULT;
+        }
+        // 鎯呭喌 2: 鐢ㄦ埛鎷掔粷鏉冮檺锛堝寘鎷娆℃嫆缁濄�佹案涔呮嫆缁濓級
+        if (flag == PackageManager.PERMISSION_DENIED) {
+            boolean isShould = ActivityCompat.shouldShowRequestPermissionRationale(activity, authorize);
+            if (isShould) {
+                // 鏅�氭嫆缁濓紙鐢ㄦ埛鍙槸鐐逛簡鎷掔粷锛屾病鏈夊嬀閫�"涓嶅啀璇㈤棶"锛�
+                // 杩欑鎯呭喌鍐嶆 requestPermissions() 杩樹細寮圭獥
+                return STATUS_REFUSE;
+            } else {
+                // 姘镐箙鎷掔粷锛堢敤鎴峰嬀閫変簡"涓嶅啀璇㈤棶"锛夛紱銆愭敞鎰忥細鏈変簺鎵嬫満娌℃湁鈥滀笉鍐嶈闂�濋�夐」锛岀偣鍑讳袱娆′互涓婃嫆缁濓紝灏变細鍙樻垚姘镐箙鎷掔粷銆�
+                // 鎴栬�呮槸鍦ㄦ煇浜涚壒娈婂満鏅笅锛堝璁惧绛栫暐闄愬埗锛�
+                // 杩欑鎯呭喌鍐嶆 requestPermissions() 涔熶笉浼氬脊绐楋紝蹇呴』寮曞鐢ㄦ埛鍘昏缃〉闈㈡墜鍔ㄥ紑鍚�
+                return STATUS_REFUSE_PERMANENT;
+            }
+        }
+        return STATUS_REFUSE;
+    }
+
+
+    /**
+     * 鐢宠鏉冮檺鏈夊洖璋�
+     *
+     * @param activity                -
+     * @param permission              -
+     * @param permissionStateCallback -
+     * @param is_skip                 鎷掔粷鏉冮檺鍚庢槸鍚﹀紩瀵煎埌璁剧疆閭i噷鎵撳紑(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<String> permissions, boolean all) {
+                        SharedPreUtils.putBoolean(permission, true);
+                        if (permissionStateCallback != null) {
+                            permissionStateCallback.Success(STATUS_SUCCESS);
+                        }
+                    }
+
+                    @Override
+                    public void onDenied(List<String> 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);
+    }
+
 
 }

--
Gitblit v1.8.0