2023-04-27 Android APP 不同机型跳转应用权限设置页面,我这里在小米(android12)和三星(android8)上测试

该代码实现了一个类`JumpPermissionManagement`,用于根据不同品牌的Android手机(如华为、VIVO、OPPO、酷派、魅族、小米、三星、索尼、LG等)跳转到对应系统的应用权限管理页面。针对每个品牌,代码提供了特定的跳转逻辑,如果无法直接跳转,则会引导用户进入通用的系统设置页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、代码

package com.xxx.bluetooth_ble.permission;



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 android.util.Log;

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


public class JumpPermissionManagement {

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

    public JumpPermissionManagement(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();
      Log.d(TAG,"getMiuiVersion:"+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 if ("V130".equals(rom)){
            intent= new Intent("miui.intent.action.APP_PERM_EDITOR");
            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
            intent.putExtra("extra_pkgname", mContext.getPackageName());
        }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();
        }
    }
}


二、调用的地方

JumpPermissionManagement m_JumpPermissionManagement = new JumpPermissionManagement(m_context);
m_JumpPermissionManagement.jumpPermissionPage();

三、三星手机的界面

 四、小米平板

1、打开settings里面的该app的权限界面,执行

dumpsys activity | grep mFocusedApp

 2、跳转的地方代码

private void goXiaoMiMainager() {
      String rom = getMiuiVersion();
      Log.d(TAG,"getMiuiVersion:"+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 if ("V130".equals(rom)){
            intent= new Intent("miui.intent.action.APP_PERM_EDITOR");
            intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
            intent.putExtra("extra_pkgname", mContext.getPackageName());
        }else
            goIntentSetting();

        mContext.startActivity(intent);
    }

3、效果

 

 

五、参考文章

Android调用miui给权限,Android跳转至MIUI权限设置页面_喝冰红茶的虫的博客-CSDN博客

Android兼容适配 - 不同机型跳转应用权限设置页面_android跳转应用权限设置_Modu_Liu的博客-CSDN博客

参考资源链接:[Android悬浮窗权限机型系统适配策略与技巧](https://wenku.csdn.net/doc/645c5af4fcc539136831e160?utm_source=wenku_answer2doc_content) 要适配Android系统中的悬浮窗权限,尤其是在API19之前的版本主流机型上,需要开发者遵循Android系统的版本特性,以及各主流设备制造商的权限管理规则。可以通过《Android悬浮窗权限机型系统适配策略与技巧》这本书来获取详细的适配方法技术要点。以下是具体的适配策略: 1. 针对API19之前的版本,由于没有统一的悬浮窗权限控制机制,需要检查不同设备的ROM是否有提供相关的权限接口。例如,某些MIUI版本可能需要特定的方法来请求权限。 2. 使用adb shell工具可以查看设备上悬浮窗权限的管理情况,通过解析权限页面的相关信息,确定需要的包名、activity名以及是否有额外的跳转参数。 3. 参考大公司的实现方式,比如QQ是如何在不同版本的Android系统各种主流机型上实现悬浮窗权限的请求与适配的。通过分析这些APP的实现,可以学习到实用的技巧。 4. 对于小米等品牌的设备,可以通过网络搜索特定型号的适配方法,这些设备往往在权限管理上有特殊的处理方式,需要特别关注。 5. 从Android 6.0开始,Google引入了AppOpsManager API,这使得悬浮窗权限的适配变得相对简单。但是,为了向后兼容,开发者需要处理API19之前的版本。 在进行适配时,开发者应当密切关注Android系统的版本更新以及主流设备制造商的政策变化,这些因素都将直接影响悬浮窗权限的管理方式。通过上述策略的综合运用,可以有效地解决在不同设备上进行悬浮窗权限适配的常见问题。 参考资源链接:[Android悬浮窗权限机型系统适配策略与技巧](https://wenku.csdn.net/doc/645c5af4fcc539136831e160?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值