美文网首页
动态申请权限

动态申请权限

作者: 名字不想带英文 | 来源:发表于2020-03-28 18:19 被阅读0次

    建议直接找框架,这个看看就行。说到底感觉封装后用起来还是不方便

    public class PermissionHelper {
        private final int GET_PERMISSION_REQUEST = 100; //权限申请自定义码
        public static final int REQUEST_PERMISSION = 1234;
        private boolean hasAlwaysDenied = false;//是否彻底拒绝过
        private String[] Permissions;
        private PermissionInterface permissionInterface;
    
        public void setPermissionInterface(PermissionInterface permissionInterface) {
            this.permissionInterface = permissionInterface;
        }
    
        private Activity activity;
    
        public PermissionHelper(Activity activity) {
            this.activity = activity;
        }
    
        public void setPermissions(String[] pers, PermissionInterface permissionInterface) {
            Permissions = pers;
            this.permissionInterface = permissionInterface;
            checkPermission();
        }
    
        public void checkPermission() {
            ActivityCompat.requestPermissions(activity, Permissions, GET_PERMISSION_REQUEST);
        }
    
        public void dealRequestCode(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if (requestCode == GET_PERMISSION_REQUEST) {
                boolean isGranted = true;
                hasAlwaysDenied = false;
                for (int i = 0; i < grantResults.length; i++) {
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                        isGranted = false;
                        if (!hasAlwaysDenied) {
                            if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, Permissions[i])) {//true表示被拒绝的权限可以调起窗口
                                hasAlwaysDenied = true;
                                break;
                            }
                        }
                    }
                }
                if (!isGranted) {
                    showTipDialg();
                } else {
                    if (permissionInterface != null) {
                        permissionInterface.PermissionSuc();
                    }
                    //"权限申请成功";
                }
            }
        }
    
        private AlertDialog tipDialog;
    
        private void showTipDialg() {
            if (tipDialog == null) {
                tipDialog = new AlertDialog.Builder(activity)
                        .setTitle("通知")
                        .setMessage("没有读写和手机设备权限无法使用微课堂,是否去设置?")
                        .setCancelable(false)
                        .setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                if (hasAlwaysDenied) {//彻底拒绝,调到手机权限页面叫用户自己去开启权限
                                    goPermissionSetting(activity);
                                } else {//重新再吊起一遍权限申请
                                    checkPermission();
                                }
                                dialog.dismiss();
                            }
                        })
                        .setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                                activity.finish();
                            }
                        }).create();
            }
            if (!tipDialog.isShowing()) {
                tipDialog.show();
            }
        }
    
        public interface PermissionInterface {
            void PermissionSuc();
        }
    
        // TODO: 2020/9/22 各机型调起跳转权限页面
        public void goPermissionSetting(Activity activity) {
            String deviceType = Build.MANUFACTURER.toLowerCase();//获取设备类型小写(例:xiaomi)
            if (deviceType.equals("xiaomi")) {
                activity.startActivityForResult(xiaomiApi(activity), REQUEST_PERMISSION);
            } else if (deviceType.equals("huawei")) {
                activity.startActivityForResult(huaweiApi(activity), REQUEST_PERMISSION);
            } else if (deviceType.equals("oppo")) {
                activity.startActivityForResult(oppoApi(activity), REQUEST_PERMISSION);
            } else if (deviceType.equals("meizu")) {
                activity.startActivityForResult(meizuApi(activity), REQUEST_PERMISSION);
            } else if (deviceType.equals("vivo")) {
                activity.startActivityForResult(vivoApi(activity), REQUEST_PERMISSION);
            } else if (deviceType.equals("samsung")) {
                activity.startActivityForResult(defaultApi(activity), REQUEST_PERMISSION);
            } else if (deviceType.equals("sony")) {
                goSonyManager(activity);
            } else if (deviceType.equals("lg")) {
                goLGManager(activity);
            } else if (deviceType.equals("letv")) {
                goLetvManager(activity);
            } else if (deviceType.equals("qiku") || deviceType.equals("360")) {
                go360Manager(activity);
            } else {
                activity.startActivityForResult(defaultApi(activity), REQUEST_PERMISSION);
            }
        }
    
    
        //    索尼
        private void goSonyManager(Context context) {
            try {
                Intent intent = new Intent(BuildConfig.APPLICATION_ID);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");
                intent.setComponent(comp);
                context.startActivity(intent);
            } catch (Exception e) {
                goAppDetailSetting(context);
            }
        }
    
        //    LG
        private void goLGManager(Context context) {
            try {
                Intent intent = new Intent("android.intent.action.MAIN");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
                ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity");
                intent.setComponent(comp);
                context.startActivity(intent);
            } catch (Exception e) {
                goAppDetailSetting(context);
            }
        }
    
        //    乐视
        private void goLetvManager(Context context) {
            try {
                Intent intent = new Intent();
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
                ComponentName comp = new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.PermissionAndApps");
                intent.setComponent(comp);
                context.startActivity(intent);
            } catch (Exception e) {
                goAppDetailSetting(context);
            }
        }
    
        //360只能打开到自带安全软件
        private void go360Manager(Context context) {
            try {
                Intent intent = new Intent("android.intent.action.MAIN");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
                ComponentName comp = new ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity");
                intent.setComponent(comp);
                context.startActivity(intent);
            } catch (Exception e) {
                goAppDetailSetting(context);
            }
        }
    
        private static String getSystemProperty(String key, String defaultValue) {
            try {
                Class<?> clz = Class.forName("android.os.SystemProperties");
                Method get = clz.getMethod("get", String.class, String.class);
                return (String) get.invoke(clz, key, defaultValue);
            } catch (Exception e) {
            }
            return defaultValue;
        }
    
        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 boolean hasActivity(Context context, Intent intent) {
            PackageManager packageManager = context.getPackageManager();
            return packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
        }
    
        private 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) {
                    }
                }
            }
        }
    
        private static Intent huaweiApi(Context context) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                return defaultApi(context);
            }
            Intent intent = new Intent();
            intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"));
            return intent;
        }
    
        private static final String MIUI_VERSION_NAME = "ro.miui.ui.version.name";
    
        private static Intent xiaomiApi(Context context) {
            String version = getSystemProperty(MIUI_VERSION_NAME);
            if (TextUtils.isEmpty(version) || version.contains("7") || version.contains("8")) {
                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());
            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 void goAppDetailSetting(Context context) {
            Intent localIntent = new Intent();
            localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            localIntent.setData(Uri.fromParts("package", BuildConfig.APPLICATION_ID, null));
            try {
                context.startActivity(localIntent);
            } catch (Exception e) {
                Toast.makeText(context, e.getMessage() + "", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }
    }
    
    

    使用例子

    private String[] Permissions = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE
        };
        public void initPermission() {
            permissionHelper = new PermissionHelper(ShootActivity.this);
            permissionHelper.setPermissions(Permissions, new PermissionHelper.PermissionInterface() {
                @Override
                public void PermissionSuc() {
                    LogUtil.i("权限申请成功");
                }
            });
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            permissionHelper.dealRequestCode(requestCode, permissions, grantResults);
        }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == PermissionHelper.REQUEST_PERMISSION) {
                permissionHelper.checkPermission();
            }
        }
    

    相关文章

      网友评论

          本文标题:动态申请权限

          本文链接:https://www.haomeiwen.com/subject/kvysuhtx.html