Android兼容适配 - 不同机型跳转应用权限设置页面

无聊之际看项目代码时发现一个需要兼容适配的场景,也就是跳转应用权限设置页面需要兼容不同厂商机型,所以抓紧时间记录一波,增加下我那不扎实的经验厚度

以前有记录过一些跟系统设置有关的Blog

关于各机型跳转应用权限设置页面的兼容方式,基本都大同小异,自行取舍即可

项目使用

兼容中工具中的 Log 是使用了 Timber 框架,报错后自行改为普通 Log 即可~

调用方式

 //项目里是通过实例方式进行调用的
 new PermissionPageManager(context).jumpPermissionPage())
 //要是自己改的话,也可以改为静态的方式调用,不过需要自行更改工具类
 //1.因为要调用 startActivity,所以也需要外部动态传入上下文
 //2.然后更改工具内部传入context的场景(可看<网上杂谈>),修改后可用类似以下操作
 PermissionPageManager.jumpPermissionPage(context)

兼容工具类

package xxx路径;

import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import timber.log.Timber;

/**
 * @Description: 兼容各机型跳转应用权限设置的方式
 */
public class PermissionPageManager {
    
    

    private Context mContext;
    //自己的项目包名
    private String packageName = "your-packageName(自己去清单文件看一下)";

    public PermissionPageUtils(Context context) {
    
    
        this.mContext = context;
    }

    public void jumpPermissionPage() {
    
    
        try {
    
    
            String name = Build.MANUFACTURER;
            switch (name) {
    
    
                case "HUAWEI":
                    goHuaWeiManager();
                    break;
                case "vivo":
                    goVivoManager();
                    break;
                case "OPPO":
                    goOppoManager();
                    break;
                case "Coolpad":
                    goCoolpadManager();
                    break;
                case "Meizu":
                    goMeiZuManager();
                    break;
                case "Xiaomi":
                    goXiaoMiMainager();
                    break;
                case "samsung":
                    goSangXinManager();
                    break;
                case "Sony":
                    goSonyManager();
                    break;
                case "LG":
                    goLGManager();
                    break;
                default:
                    goIntentSetting();
                    break;
            }
        } catch (Exception e) {
    
    
            goIntentSetting();
        }
    }

    private void goLGManager() {
    
    
        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) {
    
    
            goIntentSetting();
        }
    }

    private void goSonyManager() {
    
    
        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) {
    
    
            goIntentSetting();
        }
    }

    private void goHuaWeiManager() {
    
    
        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) {
    
    
            goIntentSetting();
        }
    }

    private static String getMiuiVersion() {
    
    
        String propName = "ro.miui.ui.version.name";
        String line = null;
        BufferedReader input = null;
        try {
    
    
            Process p = Runtime.getRuntime().exec("getprop " + propName);
            input = new BufferedReader(
                    new InputStreamReader(p.getInputStream()), 1024);
            line = input.readLine();
        } catch (Exception ex) {
    
    
            Timber.e(ex);
        } finally {
    
    
            if (input != null) {
    
    
                try {
    
    
                    input.close();
                } catch (IOException e) {
    
    
                    Timber.e(e);
                }
            }
        }
        return line;
    }

    private void goXiaoMiMainager() {
    
    
        String rom = getMiuiVersion();
        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 goMeiZuManager() {
    
    
        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 goSangXinManager() {
    
    
        //三星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) {
    
    
            Timber.e(e);
        }
    }

    private void goOppoManager() {
    
    
        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 goCoolpadManager() {
    
    
        doStartApplicationWithPackageName("com.yulong.android.security:remote");
      /*  Intent openQQ = getPackageManager().getLaunchIntentForPackage("com.yulong.android.security:remote");
        startActivity(openQQ);*/
    }

    private void goVivoManager() {
    
    
        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) {
    
    
            Timber.e(e);
        }
        if (packageinfo == null) {
    
    
            return;
        }
        try {
    
    
            // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
            Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
            resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            resolveIntent.setPackage(packageinfo.packageName);
            // 通过getPackageManager()的queryIntentActivities方法遍历
            List<ResolveInfo> resolveinfoList = mContext.getPackageManager().queryIntentActivities(resolveIntent, 0);
            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);
                mContext.startActivity(intent);
            }
        } catch (Exception e) {
    
    
            goIntentSetting();
        }
    }
}


网上杂谈

因为我是先看的项目代码,后面在网上查了一下相关场景,发现也有类似兼容权限设置的 Bolg ,不过该篇是2022年的产物,而项目内使用的兼容方式是2019年就存在咯 ~

/**
 * @description 跳转各个手机系统权限设置界面
 */
public class JumpPermissionManagement {
    
    

    private static final String TAG = "JumpPermissionManagement";

    /**
     * Build.MANUFACTURER
     */
    private static final String MANUFACTURER_HUAWEI = "HUAWEI";//华为
    private static final String MANUFACTURER_MEIZU = "Meizu";//魅族
    private static final String MANUFACTURER_XIAOMI = "Xiaomi";//小米
    private static final String MANUFACTURER_SONY = "Sony";//索尼
    private static final String MANUFACTURER_OPPO = "OPPO";//oppo
    private static final String MANUFACTURER_LG = "LG";
    private static final String MANUFACTURER_VIVO = "vivo";//vivo
    private static final String MANUFACTURER_SAMSUNG = "samsung";//三星
    private static final String MANUFACTURER_ZTE = "ZTE";//中兴
    private static final String MANUFACTURER_YULONG = "YuLong";//酷派
    private static final String MANUFACTURER_LENOVO = "LENOVO";//联想

    /**
     * 此函数可以自己定义
     * @param activity
     */
    public static void GoToSetting(Activity activity){
    
    
        switch (Build.MANUFACTURER){
    
    
            case MANUFACTURER_HUAWEI:
                Huawei(activity);
                break;
            case MANUFACTURER_MEIZU:
                Meizu(activity);
                break;
            case MANUFACTURER_XIAOMI:
                Xiaomi(activity);
                break;
            case MANUFACTURER_SONY:
                Sony(activity);
                break;
            case MANUFACTURER_OPPO:
                OPPO(activity);
                break;
            case MANUFACTURER_LG:
                LG(activity);
                break;
            default:
                ApplicationInfo(activity);
                Log.e("goToSetting", "目前暂不支持此系统");
                break;
        }
    }

    public static void Huawei(Activity activity) {
    
    
        try {
    
    
            Intent intent = new Intent();
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("packageName", activity.getApplicationInfo().packageName);
            ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
            intent.setComponent(comp);
            activity.startActivity(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            goIntentSetting(activity);
        }
    }

    public static void Meizu(Activity activity) {
    
    
        try {
    
    
            Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.putExtra("packageName", activity.getPackageName());
            activity.startActivity(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            goIntentSetting(activity);
        }
    }

    public static void Xiaomi(Activity activity) {
    
    
        try {
    
    
            Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
            intent.putExtra("extra_pkgname", activity.getPackageName());
            ComponentName componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
            intent.setComponent(componentName);
            activity.startActivity(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            goIntentSetting(activity);
        }
    }

    public static void Sony(Activity activity) {
    
    
        try {
    
    
            Intent intent = new Intent();
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("packageName", activity.getPackageName());
            ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");
            intent.setComponent(comp);
            activity.startActivity(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            goIntentSetting(activity);
        }
    }

    public static void OPPO(Activity activity) {
    
    
        try {
    
    
            Intent intent = new Intent();
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("packageName", activity.getPackageName());
    //        ComponentName comp = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity");
            ComponentName comp = new ComponentName("com.coloros.securitypermission", "com.coloros.securitypermission.permission.PermissionAppAllPermissionActivity");//R11t 7.1.1 os-v3.2
            intent.setComponent(comp);
            activity.startActivity(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            goIntentSetting(activity);
        }
    }

    public static void LG(Activity activity) {
    
    
        try {
    
    
            Intent intent = new Intent("android.intent.action.MAIN");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("packageName", activity.getPackageName());
            ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity");
            intent.setComponent(comp);
            activity.startActivity(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            goIntentSetting(activity);
        }
    }

    /**
     * 只能打开到自带安全软件
     * @param activity
     */
    public static void _360(Activity activity) {
    
    
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("packageName", activity.getPackageName());
        ComponentName comp = new ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity");
        intent.setComponent(comp);
        activity.startActivity(intent);
    }

    /**
     * 应用信息界面
     * @param activity
     */
    public static void ApplicationInfo(Activity activity){
    
    
        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", activity.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", activity.getPackageName());
        }
        activity.startActivity(localIntent);
    }

    /**
     * 系统设置界面
     * @param activity
     */
    public static void SystemConfig(Activity activity) {
    
    
        Intent intent = new Intent(Settings.ACTION_SETTINGS);
        activity.startActivity(intent);
    }

    /**
     * 默认打开应用详细页
     */
    private static void goIntentSetting(Activity pActivity) {
    
    
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", pActivity.getPackageName(), null);
        intent.setData(uri);
        try {
    
    
            pActivity.startActivity(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/128565177