转载请标明出处:http://blog.csdn.net/donkor_/article/details/79374442

▲ 前言

当我们的用户使用App时不小心拒绝了某项必要权限,而导致无法正常使用。这时候希望重新去打开该权限,那么问题来了,Android厂家定制的room五花八门,很多时候却发现找不到权限管理的入口。为了解决这一问题,如果我们应用中直接提供权限管理入口给用户,是不是会很方便的解决用户这一困扰呢?经过一番研究,整理出了大部分国产手机直接打开权限管理界面的方法

▲ 权限界面的跳转

一般项目中我们都会通过一个类来管理我们的Permission,即PermissionPageUtils

/** * 权限请求页适配,不同手机系统跳转到不同的权限请求页 * * @author Donkor */public class PermissionPageUtils {    private final String TAG = "PermissionPageManager";    private Context mContext;    //自己的项目包名    private String packageName="com.donkor.demo";    public PermissionPageUtils(Context context) {        this.mContext = context;    }    public void jumpPermissionPage() {        String name = Build.MANUFACTURER;        L.e(TAG, "jumpPermissionPage --- name : " + name);        switch (name) {            case "HUAWEI":                goHuaWeiMainager();                break;            case "vivo":                goVivoMainager();                break;            case "OPPO":                goOppoMainager();                break;            case "Coolpad":                goCoolpadMainager();                break;            case "Meizu":                goMeizuMainager();                break;            case "Xiaomi":                goXiaoMiMainager();                break;            case "samsung":                goSangXinMainager();                break;            case "Sony":                goSonyMainager();                break;            case "LG":                goLGMainager();                break;            default:                goIntentSetting();                break;        }    }    private void goLGMainager(){        try {            Intent intent = new Intent(packageName);            ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity");            intent.setComponent(comp);            mContext.startActivity(intent);        } catch (Exception e) {            Toast.makeText(mContext, "跳转失败", Toast.LENGTH_LONG).show();            e.printStackTrace();            goIntentSetting();        }    }    private void goSonyMainager(){        try {            Intent intent = new Intent(packageName);            ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");            intent.setComponent(comp);            mContext.startActivity(intent);        } catch (Exception e) {            Toast.makeText(mContext, "跳转失败", Toast.LENGTH_LONG).show();            e.printStackTrace();            goIntentSetting();        }    }    private void goHuaWeiMainager() {        try {            Intent intent = new Intent(packageName);            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");            intent.setComponent(comp);            mContext.startActivity(intent);        } catch (Exception e) {            Toast.makeText(mContext, "跳转失败", Toast.LENGTH_LONG).show();            e.printStackTrace();            goIntentSetting();        }    }    private static String getMiuiVersion() {        String propName = "ro.miui.ui.version.name";        String line;        BufferedReader input = null;        try {            Process p = Runtime.getRuntime().exec("getprop " + propName);            input = new BufferedReader(                    new InputStreamReader(p.getInputStream()), 1024);            line = input.readLine();            input.close();        } catch (IOException ex) {            ex.printStackTrace();            return null;        } finally {            try {                input.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return line;    }    private void goXiaoMiMainager() {        String rom = getMiuiVersion();        L.e(TAG,"goMiaoMiMainager --- rom : "+rom);        Intent intent=new Intent();        if ("V6".equals(rom) || "V7".equals(rom)) {            intent.setAction("miui.intent.action.APP_PERM_EDITOR");            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");            intent.putExtra("extra_pkgname", packageName);        } else if ("V8".equals(rom) || "V9".equals(rom)) {            intent.setAction("miui.intent.action.APP_PERM_EDITOR");            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");            intent.putExtra("extra_pkgname", packageName);        } else {            goIntentSetting();        }        mContext.startActivity(intent);    }    private void goMeizuMainager() {        try {            Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");            intent.addCategory(Intent.CATEGORY_DEFAULT);            intent.putExtra("packageName", packageName);            mContext.startActivity(intent);        } catch (ActivityNotFoundException localActivityNotFoundException) {            localActivityNotFoundException.printStackTrace();            goIntentSetting();        }    }    private void goSangXinMainager() {        //三星4.3可以直接跳转        goIntentSetting();    }    private void goIntentSetting() {        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);        intent.setData(uri);        try {            mContext.startActivity(intent);        } catch (Exception e) {            e.printStackTrace();        }    }    private void goOppoMainager() {        doStartApplicationWithPackageName("com.coloros.safecenter");    }    /**     * doStartApplicationWithPackageName("com.yulong.android.security:remote")     * 和Intent open = getPackageManager().getLaunchIntentForPackage("com.yulong.android.security:remote");     * startActivity(open);     * 本质上没有什么区别,通过Intent open...打开比调用doStartApplicationWithPackageName方法更快,也是android本身提供的方法     */    private void goCoolpadMainager() {        doStartApplicationWithPackageName("com.yulong.android.security:remote");      /*  Intent openQQ = getPackageManager().getLaunchIntentForPackage("com.yulong.android.security:remote");        startActivity(openQQ);*/    }    private void goVivoMainager() {        doStartApplicationWithPackageName("com.bairenkeji.icaller");     /*   Intent openQQ = getPackageManager().getLaunchIntentForPackage("com.vivo.securedaemonservice");        startActivity(openQQ);*/    }    /**     * 此方法在手机各个机型设置中已经失效     *     * @return     */    private Intent getAppDetailSettingIntent() {        Intent localIntent = new Intent();        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        if (Build.VERSION.SDK_INT >= 9) {            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");            localIntent.setData(Uri.fromParts("package", mContext.getPackageName(), null));        } else if (Build.VERSION.SDK_INT <= 8) {            localIntent.setAction(Intent.ACTION_VIEW);            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");            localIntent.putExtra("com.android.settings.ApplicationPkgName", mContext.getPackageName());        }        return localIntent;    }    private void doStartApplicationWithPackageName(String packagename) {        // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等        PackageInfo packageinfo = null;        try {            packageinfo = mContext.getPackageManager().getPackageInfo(packagename, 0);        } catch (PackageManager.NameNotFoundException e) {            e.printStackTrace();        }        if (packageinfo == null) {            return;        }        // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);        resolveIntent.setPackage(packageinfo.packageName);        // 通过getPackageManager()的queryIntentActivities方法遍历        List resolveinfoList = mContext.getPackageManager()                .queryIntentActivities(resolveIntent, 0);        Log.e("PermissionPageManager", "resolveinfoList" + resolveinfoList.size());        for (int i = 0; i < resolveinfoList.size(); i++) {            Log.e("PermissionPageManager", resolveinfoList.get(i).activityInfo.packageName + resolveinfoList.get(i).activityInfo.name);        }        ResolveInfo resolveinfo = resolveinfoList.iterator().next();        if (resolveinfo != null) {            // packageName参数2 = 参数 packname            String packageName = resolveinfo.activityInfo.packageName;            // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packageName参数2.mainActivityname]            String className = resolveinfo.activityInfo.name;            // LAUNCHER Intent            Intent intent = new Intent(Intent.ACTION_MAIN);            intent.addCategory(Intent.CATEGORY_LAUNCHER);            // 设置ComponentName参数1:packageName参数2:MainActivity路径            ComponentName cn = new ComponentName(packageName, className);            intent.setComponent(cn);            try {                mContext.startActivity(intent);            } catch (Exception e) {                goIntentSetting();                e.printStackTrace();            }        }    }}

▲ 另外

当前已适配测试的机型包括小米,华为,三星,锤子。代码仅供参考。


About me
Email :donkor@yeah.net
Android开发交流QQ群 : 537891203

更多相关文章

  1. Android的消息处理机制—Looper,Handler,Message
  2. java-Service生命周期及用法! - 随心
  3. ant 编译 android工程
  4. Android(安卓)获取 usb 权限
  5. 【Android】自定义View、画布Canvas与画笔Paint
  6. Android消息处理机制——Looper,Handler,Message,MessageQueue,T
  7. android 系统权限大全
  8. Android实现使用微信登录第三方APP的方法
  9. Android中Java根据文件头获取文件类型的方法

随机推荐

  1. Android双击退出
  2. [Android(安卓)Studio][NDK]Execution fa
  3. Android(安卓)播放MP4文件
  4. android计算器简单实现代码
  5. VirtualBox下使用Ubuntu 虚拟机Android(
  6. Android(安卓)基础布局控件自定义view使
  7. Jenkins持续集成安卓 Android
  8. Android(安卓)OkHttp异常
  9. Android(安卓)studio 导入github工程
  10. Android(安卓)拦截修改电话号码