Browse Source

添加创建快捷方式权限请求

kth_win_android 2 years ago
parent
commit
96db96834e

+ 4 - 4
README.md

@@ -9,7 +9,7 @@
 ~~~
 repositories {
         maven {
-            url "http://www.benyanyi.com/repository/benyanyi/"
+            url "https://www.benyanyi.com/repository/benyanyi/"
         }
     }
 ~~~
@@ -19,8 +19,7 @@ repositories {
 dependencyResolutionManagement {
     repositories {
         maven {
-            allowInsecureProtocol = true
-            url "http://www.benyanyi.com/repository/benyanyi/"
+            url "https://www.benyanyi.com/repository/benyanyi/"
         }
     }
 }
@@ -76,4 +75,5 @@ implementation 'com.yanyi.benyanyi:PermissionHelper:1.1.8'
 * 2019-05-24更新(1.0.5) 添加注解调用申请权限
 * 2019-01-21更新(1.0.2) 修复自定义弹窗信息,弹窗设置不显示状态时没回调
 * 2018-06-09更新(1.0.1) 新增弹窗配置信息修改(PermissionDialogInfo)
-* 2018-06-08创建(1.0.0) 创建
+* 2018-06-08创建(1.0.0) 创建
+

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -15,6 +15,9 @@
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
 
+    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
+    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
+
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"

+ 6 - 1
app/src/main/java/com/yanyi/basepermission/MainActivity.java

@@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity;
 
 import com.benyanyi.permissionlib.callback.PermissionCallBack;
 import com.benyanyi.permissionlib.PermissionHelper;
+import com.benyanyi.permissionlib.type.PermissionType;
 
 /**
  * @author myLove
@@ -32,7 +33,8 @@ public class MainActivity extends AppCompatActivity {
                         Manifest.permission.ACCESS_COARSE_LOCATION,
                         Manifest.permission.ACCESS_FINE_LOCATION,
                         Manifest.permission.WRITE_EXTERNAL_STORAGE,
-                        Manifest.permission.MANAGE_EXTERNAL_STORAGE)
+                        Manifest.permission.MANAGE_EXTERNAL_STORAGE,
+                        PermissionType.SHORTCUT)
                 .setDefaultPermissionDialogInfo()
                 .request(new PermissionCallBack() {
                     @Override
@@ -43,6 +45,9 @@ public class MainActivity extends AppCompatActivity {
                     @Override
                     public void onFailure(String[] failurePermissions) {
                         log("请求失败");
+                        for (String failurePermission : failurePermissions) {
+                            log(failurePermission);
+                        }
                     }
 
                     @Override

+ 1 - 0
permissionlib/build.gradle

@@ -31,6 +31,7 @@ dependencies {
     testImplementation 'junit:junit:4.13'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+    implementation 'com.yanyi.benyanyi:Logger:1.1.2'
 }
 afterEvaluate {
     // 排除 BuildConfig.class 和 R.class

+ 111 - 15
permissionlib/src/main/java/com/benyanyi/permissionlib/PermissionFragment.java

@@ -18,8 +18,12 @@ import androidx.annotation.Nullable;
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
 
+import com.benyanyi.loglib.Jlog;
 import com.benyanyi.permissionlib.callback.PermissionCallBack;
 import com.benyanyi.permissionlib.dialog.PermissionDialogInfo;
+import com.benyanyi.permissionlib.shortcut.RuntimeSettingPage;
+import com.benyanyi.permissionlib.shortcut.ShortcutPermissionChecker;
+import com.benyanyi.permissionlib.type.PermissionType;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -41,9 +45,16 @@ public final class PermissionFragment extends Fragment {
     private List<String> oList = new ArrayList<>();
 
     private String[] permissions;
-    private String[] permissions2;
     private PermissionCallBack callBack;
 
+    private boolean manageExternalStorage = false;
+    private boolean shortcutPermission = false;
+
+    private boolean checkManageExternalStorage = false;//判断是否请求访问全部文件权限
+    private boolean checkShortcutPermission = false;//判断是否请求创建快捷方式权限
+
+    private static final String MARK = Build.MANUFACTURER.toLowerCase();
+
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -56,18 +67,18 @@ public final class PermissionFragment extends Fragment {
      */
     void setPermissions(String[] permissions) {
         List<String> list1 = new ArrayList<>();
-        List<String> list2 = new ArrayList<>();
         for (String permission : permissions) {
             if (permission.equalsIgnoreCase(Manifest.permission.MANAGE_EXTERNAL_STORAGE)) {
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-                    list2.add(permission);
+                    manageExternalStorage = true;
                 }
+            } else if (permission.equalsIgnoreCase(PermissionType.SHORTCUT)) {
+                shortcutPermission = true;
             } else {
                 list1.add(permission);
             }
         }
         this.permissions = list1.toArray(new String[0]);
-        this.permissions2 = list2.toArray(new String[0]);
     }
 
     /**
@@ -92,16 +103,19 @@ public final class PermissionFragment extends Fragment {
      */
     void startForPermissionResult() {
         if (checkPermission()) {
-            if (permissions2 != null && permissions2.length <= 0) {
+            if (!manageExternalStorage && !shortcutPermission) {
                 if (this.callBack != null) {
                     this.callBack.onSuccess();
                     this.callBack.onComplete();
                     PermissionHelper.removeFragment();
                 }
             } else {
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && manageExternalStorage && !Environment.isExternalStorageManager()) {
                     Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                     startActivity(intent);
+                } else if (shortcutPermission && !checkShortcut()) {
+                    RuntimeSettingPage settingPage = new RuntimeSettingPage(getActivity());
+                    settingPage.start();
                 } else {
                     if (this.callBack != null) {
                         this.callBack.onSuccess();
@@ -127,7 +141,7 @@ public final class PermissionFragment extends Fragment {
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             for (String permission : permissions) {
-                if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
+                if (!permission.equalsIgnoreCase(PermissionType.SHORTCUT) && ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
                     if (!oList.contains(permission)) {
                         oList.add(permission);
                     }
@@ -135,7 +149,7 @@ public final class PermissionFragment extends Fragment {
             }
         } else {
             for (String permission : permissions) {
-                if (ActivityCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
+                if (!permission.equalsIgnoreCase(PermissionType.SHORTCUT) && ActivityCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
                     if (!oList.contains(permission)) {
                         oList.add(permission);
                     }
@@ -145,6 +159,28 @@ public final class PermissionFragment extends Fragment {
         return oList.isEmpty();
     }
 
+    /**
+     * 判断是否有创建快捷方式权限
+     *
+     * @return 是否有创建快捷方式权限
+     */
+    private boolean checkShortcut() {
+        Jlog.v(MARK);
+        boolean result = false;
+        if (MARK.contains("huawei")) {
+            result = ShortcutPermissionChecker.checkOnEMUI(getActivity());
+        } else if (MARK.contains("xiaomi")) {
+            result = ShortcutPermissionChecker.checkOnMIUI(getActivity());
+        } else if (MARK.contains("oppo")) {
+            result = ShortcutPermissionChecker.checkOnOPPO(getActivity());
+        } else if (MARK.contains("vivo")) {
+            result = ShortcutPermissionChecker.checkOnVIVO(getActivity());
+        } else if (MARK.contains("samsung") || MARK.contains("meizu")) {
+            result = true;
+        }
+        return !result;
+    }
+
     /**
      * 请求权限
      */
@@ -217,13 +253,17 @@ public final class PermissionFragment extends Fragment {
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        Jlog.d();
         List<String> list = hasAllPermissionsGranted(permissions, grantResults);
         boolean boo = list.isEmpty() && (this.code1 == requestCode || this.code2 == requestCode);
         if (boo) {
-            if (this.permissions2 != null && this.permissions2.length > 0) {
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
+            if (manageExternalStorage || shortcutPermission) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && manageExternalStorage && !Environment.isExternalStorageManager()) {
                     Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                     startActivity(intent);
+                } else if (shortcutPermission && !checkShortcut()) {
+                    RuntimeSettingPage settingPage = new RuntimeSettingPage(getActivity());
+                    settingPage.start();
                 } else {
                     if (this.callBack != null) {
                         this.callBack.onSuccess();
@@ -238,11 +278,13 @@ public final class PermissionFragment extends Fragment {
                     PermissionHelper.removeFragment();
                 }
             }
-        } else if (this.permissions2 != null && this.permissions2.length > 0
-                && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
+        } else if (manageExternalStorage && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
                 && !Environment.isExternalStorageManager()) {
             Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
             startActivity(intent);
+        } else if (shortcutPermission && !checkShortcut()) {
+            RuntimeSettingPage settingPage = new RuntimeSettingPage(getActivity());
+            settingPage.start();
         } else {
             oList = list;
             if (this.code1 == requestCode) {
@@ -275,12 +317,39 @@ public final class PermissionFragment extends Fragment {
     @Override
     public void onResume() {
         super.onResume();
+        Jlog.d("onResume:" + isStop);
         if (this.isStop) {
             if (checkPermission()) {
-                if (this.permissions2 != null && this.permissions2.length > 0) {
-                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
+                Jlog.v();
+                if (manageExternalStorage || shortcutPermission) {
+                    Jlog.d(manageExternalStorage);
+                    Jlog.d(checkManageExternalStorage);
+                    Jlog.d(shortcutPermission);
+                    Jlog.d(checkShortcutPermission);
+                    List<String> list = new ArrayList<>();
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && manageExternalStorage && !Environment.isExternalStorageManager()) {
+                        if (!checkManageExternalStorage) {
+                            Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
+                            startActivity(intent);
+                            checkManageExternalStorage = true;
+                        } else {
+                            Jlog.d();
+                            list.add(Manifest.permission.MANAGE_EXTERNAL_STORAGE);
+                        }
+                    }
+                    if (shortcutPermission && !checkShortcut()) {
+                        Jlog.d(checkShortcutPermission);
+                        if (!checkShortcutPermission) {
+                            RuntimeSettingPage settingPage = new RuntimeSettingPage(getActivity());
+                            settingPage.start();
+                        } else {
+                            list.add(PermissionType.SHORTCUT);
+                        }
+                    }
+                    Jlog.d(list.size());
+                    if (!list.isEmpty()) {
                         if (this.callBack != null) {
-                            this.callBack.onFailure(this.permissions2);
+                            this.callBack.onFailure(list.toArray(new String[0]));
                             this.callBack.onComplete();
                             PermissionHelper.removeFragment();
                         }
@@ -299,13 +368,39 @@ public final class PermissionFragment extends Fragment {
                     }
                 }
             } else {
+                Jlog.d(manageExternalStorage);
+                Jlog.d(checkManageExternalStorage);
+                Jlog.d(shortcutPermission);
+                Jlog.d(checkShortcutPermission);
+                List<String> list = new ArrayList<>();
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && manageExternalStorage && !Environment.isExternalStorageManager()) {
+                    if (!checkManageExternalStorage) {
+                        Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
+                        startActivity(intent);
+                        checkManageExternalStorage = true;
+                    } else {
+                        Jlog.d();
+                        list.add(Manifest.permission.MANAGE_EXTERNAL_STORAGE);
+                    }
+                }
+                if (shortcutPermission && !checkShortcut()) {
+                    Jlog.d(checkShortcutPermission);
+                    if (!checkShortcutPermission) {
+                        RuntimeSettingPage settingPage = new RuntimeSettingPage(getActivity());
+                        settingPage.start();
+                    } else {
+                        list.add(PermissionType.SHORTCUT);
+                    }
+                }
                 if (this.isShow) {
                     showDialog();
                 } else if (this.callBack != null) {
+                    oList.addAll(list);
                     this.callBack.onFailure(this.oList.toArray(new String[0]));
                     this.callBack.onComplete();
                     PermissionHelper.removeFragment();
                 }
+
             }
         }
         this.isStop = false;
@@ -315,6 +410,7 @@ public final class PermissionFragment extends Fragment {
     public void onStop() {
         super.onStop();
         this.isStop = true;
+        Jlog.d("onStop");
     }
 
     private void setFailure() {

+ 157 - 0
permissionlib/src/main/java/com/benyanyi/permissionlib/shortcut/RuntimeSettingPage.java

@@ -0,0 +1,157 @@
+package com.benyanyi.permissionlib.shortcut;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import com.benyanyi.loglib.Jlog;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * @author DELL
+ * @date 2022/12/16 11:56
+ * @user yangjiewei
+ * @email ben@yanyi.red
+ * @overview
+ */
+public class RuntimeSettingPage {
+    private static final String MIUI_VERSION_NAME = "ro.miui.ui.version.name";
+    private static final String MARK = Build.MANUFACTURER.toLowerCase();
+
+    private final Context mSource;
+
+    public RuntimeSettingPage(Context source) {
+        this.mSource = source;
+    }
+
+    /**
+     * Start.
+     */
+    public void start() {
+        Jlog.d(MARK);
+        Intent intent;
+        if (MARK.contains("huawei")) {
+            intent = huaweiApi();
+        } else if (MARK.contains("xiaomi")) {
+            intent = xiaomiApi(mSource);
+        } else if (MARK.contains("oppo")) {
+            intent = oppoApi(mSource);
+        } else if (MARK.contains("vivo")) {
+            intent = vivoApi(mSource);
+        } else if (MARK.contains("meizu")) {
+            intent = meizuApi(mSource);
+        } else {
+            intent = defaultApi(mSource);
+        }
+        try {
+            mSource.startActivity(intent);
+        } catch (Exception e) {
+            e.printStackTrace();
+            intent = defaultApi(mSource);
+            mSource.startActivity(intent);
+        }
+    }
+
+    private static Intent defaultApi(Context context) {
+        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+        intent.setData(Uri.fromParts("package", context.getPackageName(), null));
+        return intent;
+    }
+
+    private static Intent huaweiApi() {
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"));
+        return intent;
+    }
+
+    private static Intent xiaomiApi(Context context) {
+        String version = getSystemProperty(MIUI_VERSION_NAME);
+        if (TextUtils.isEmpty(version)) {
+            return defaultApi(context);
+        }
+        int versionI;
+        try {
+            versionI = Integer.parseInt(version.substring(1));
+        } catch (NumberFormatException e) {
+            e.printStackTrace();
+            return defaultApi(context);
+        }
+        //xiaomi note2 MIUI 9.5进行适配,需要跳转至小米自带的权限软件
+        //xiaomi note2 MUUI 10.0进行适配,需要跳转至小米自带的权限软件
+        if (versionI >= 9) {
+            Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
+            intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity"));
+            intent.putExtra("extra_pkgname", context.getPackageName());
+            return intent;
+        }
+
+        if (versionI >= 7) {
+            Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
+            intent.putExtra("extra_pkgname", context.getPackageName());
+            return intent;
+        }
+
+        return defaultApi(context);
+    }
+
+    private static Intent vivoApi(Context context) {
+        Intent intent = new Intent();
+        intent.putExtra("packagename", context.getPackageName());
+        intent.setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.SoftPermissionDetailActivity"));
+        if (hasActivity(context, intent)) return intent;
+
+        intent.setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.safeguard.SoftPermissionDetailActivity"));
+        return intent;
+    }
+
+    private static Intent oppoApi(Context context) {
+        Intent intent = new Intent();
+        intent.putExtra("packageName", context.getPackageName());
+        //OPPO R9S 6.0.1,由于OPPO手机在"应用列表-xx应用-权限"下的权限列表并没有创建快捷方式一项,只能到"权限隐私-创建快捷方式"中设置。
+        intent.setClassName("com.oppo.launcher", "com.oppo.launcher.shortcut.ShortcutSettingsActivity");
+        if (hasActivity(context, intent)) return intent;
+        intent.setComponent(new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity"));
+        return intent;
+    }
+
+    private static Intent meizuApi(Context context) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            return defaultApi(context);
+        }
+        Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
+        intent.putExtra("packageName", context.getPackageName());
+        intent.setComponent(new ComponentName("com.meizu.safe", "com.meizu.safe.security.AppSecActivity"));
+        return intent;
+    }
+
+    private static boolean hasActivity(Context context, Intent intent) {
+        PackageManager packageManager = context.getPackageManager();
+        return packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
+    }
+
+    public static String getSystemProperty(String propName) {
+        BufferedReader input = null;
+        try {
+            Process p = Runtime.getRuntime().exec("getprop " + propName);
+            input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
+            return input.readLine();
+        } catch (IOException ex) {
+            return "";
+        } finally {
+            if (input != null) {
+                try {
+                    input.close();
+                } catch (IOException ignored) {
+                }
+            }
+        }
+    }
+}

+ 156 - 0
permissionlib/src/main/java/com/benyanyi/permissionlib/shortcut/ShortcutPermissionChecker.java

@@ -0,0 +1,156 @@
+package com.benyanyi.permissionlib.shortcut;
+
+import android.app.AppOpsManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * @author DELL
+ * @date 2022/12/16 13:05
+ * @user yangjiewei
+ * @email ben@yanyi.red
+ * @overview
+ */
+public class ShortcutPermissionChecker {
+
+    public static boolean checkOnEMUI(@NonNull Context context) {
+        Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
+        try {
+            Class<?> PermissionManager = Class.forName("com.huawei.hsm.permission.PermissionManager");
+            Method canSendBroadcast = PermissionManager.getDeclaredMethod("canSendBroadcast", Context.class, Intent.class);
+            Object invoke = canSendBroadcast.invoke(PermissionManager, context, intent);
+            if (invoke != null) {
+                return (boolean) invoke;
+            } else {//未知
+                return true;
+            }
+        } catch (ClassNotFoundException e) {//Multiple-catch require API level 19 未知
+            return true;
+        } catch (NoSuchMethodException e) {//未知
+            return true;
+        } catch (IllegalAccessException e) {//未知
+            return true;
+        } catch (InvocationTargetException e) {//未知
+            return true;
+        } catch (Exception e) {//未知
+            return true;
+        }
+    }
+
+    public static boolean checkOnVIVO(@NonNull Context context) {
+        ContentResolver contentResolver = context.getContentResolver();
+        if (contentResolver == null) {
+            return true;
+        }
+        Cursor query = null;
+        try {
+            Uri parse = Uri.parse("content://com.bbk.launcher2.settings/favorites");
+            query = contentResolver.query(parse, null, null, null, null);
+            if (query == null) {//未知
+                return true;
+            }
+
+            while (query.moveToNext()) {
+                String titleByQueryLauncher = query.getString(query.getColumnIndexOrThrow("title"));
+                if (!TextUtils.isEmpty(titleByQueryLauncher) && titleByQueryLauncher.equals(getAppName(context))) {
+                    int value = query.getInt(query.getColumnIndexOrThrow("shortcutPermission"));
+                    if (value == 1 || value == 17) {
+                        return false;
+                    } else if (value == 16) {
+                        return true;
+                    } else if (value == 18) {//未知 问
+                        return true;
+                    }
+                }
+            }
+        } catch (Exception e) {//未知
+        } finally {
+            if (query != null) {
+                query.close();
+            }
+        }
+        return true;
+    }
+
+    public static boolean checkOnMIUI(@NonNull Context context) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {//未知
+            return true;
+        }
+        try {
+            AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+            String pkg = context.getApplicationContext().getPackageName();
+            int uid = context.getApplicationInfo().uid;
+            Class<?> appOpsClass = Class.forName(AppOpsManager.class.getName());
+            Method checkOpNoThrowMethod = appOpsClass.getDeclaredMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE, String.class);
+            Object invoke = checkOpNoThrowMethod.invoke(mAppOps, 10017, uid, pkg);//the ops of INSTALL_SHORTCUT is 10017
+            if (invoke == null) {//未知
+                return true;
+            }
+            String result = invoke.toString();
+            switch (result) {
+                case "0":
+                    return true;
+                case "1":
+                    return false;
+                case "5"://未知 问
+                    return true;
+            }
+        } catch (Exception e) {//未知
+            return true;
+        }
+        return true;
+    }
+
+    public static boolean checkOnOPPO(@NonNull Context context) {
+        ContentResolver contentResolver = context.getContentResolver();
+        if (contentResolver == null) {//未知
+            return true;
+        }
+        Uri parse = Uri.parse("content://settings/secure/launcher_shortcut_permission_settings");
+        Cursor query = contentResolver.query(parse, null, null, null, null);
+        if (query == null) {//未知
+            return true;
+        }
+        try {
+            String pkg = context.getApplicationContext().getPackageName();
+            while (query.moveToNext()) {
+                String value = query.getString(query.getColumnIndex("value"));
+                if (!TextUtils.isEmpty(value)) {
+                    if (value.contains(pkg + ", 1")) {
+                        return true;
+                    }
+                    if (value.contains(pkg + ", 0")) {
+                        return false;
+                    }
+                }
+            }
+            return true;
+        } catch (Exception e) {//未知
+            return true;
+        } finally {
+            query.close();
+        }
+    }
+
+    private static String getAppName(Context context) {
+        try {
+            PackageManager pm = context.getPackageManager();
+            PackageInfo pi = pm.getPackageInfo(context.getApplicationContext().getPackageName(), 0);
+            return pi == null ? null : pi.applicationInfo.loadLabel(pm).toString();
+        } catch (PackageManager.NameNotFoundException e) {
+            return "";
+        }
+    }
+}

+ 11 - 0
permissionlib/src/main/java/com/benyanyi/permissionlib/type/PermissionType.java

@@ -77,4 +77,15 @@ public class PermissionType {
      * WRITE_EXTERNAL_STORAGE
      */
     public static String STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+
+    /**
+     * MANAGE_EXTERNAL_STORAGE
+     */
+    public static String MANAGE_EXTERNAL_STORAGE = Manifest.permission.MANAGE_EXTERNAL_STORAGE;
+
+    /**
+     * INSTALL_SHORTCUT
+     * UNINSTALL_SHORTCUT
+     */
+    public static String SHORTCUT = "benyanyi.permission.SHORTCUT";
 }