【前言】

     最近提出统计有多少鸿蒙系统用户的需求,就研究了一下判断鸿蒙系统的方法,刚开始研究鸿蒙系统的Api文档时,发现ohos.aafwk.ability.Ability应该是鸿蒙系统中比较基础的类,是鸿蒙应用所具备能力的抽象,也是应用程序的重要组成部分,一开始是打算通过判断是否存在这个类来区分是Harmony系统或者是Android系统, 测试发现鸿蒙系统确实是存在这个类,但是尴尬的是非鸿蒙系统的荣耀或者华为手机也存在这个类,初步猜想应该是华为之前的定制化的EMUI系统都是存在这个类,也许是一开始就为升级Harmony系统埋下了伏笔

在这里插入图片描述

一、方案1:判断是否存在纯净模式

     因为判断是否存在ohos.aafwk.ability.Ability这个类,来决定是否是鸿蒙系统这条路走不通之后,仔细分析了一下EMUI系统Harmony 系统的区别,发现Harmony系统新增了纯净模式,这是EMUI系统所没有的功能,可以尝试判断是否存在纯净模式来区分这两个系统

  /**
     * 判断是否鸿蒙系统
     * @param context
     * @return
     */
    public static boolean isHarmony(Context context) {
        try {
            //判断是否存在鸿蒙系统的运行库,非Harmony系统或者EMUI系统的会找不到这个类而抛异常,
            //可以快速排除掉其他的Android系统
            Class<?> accountAbilityClass = Class.forName("ohos.aafwk.ability.Ability");

            //再判断是否有纯净模式的activity,来进一步区分是Harmony系统或者是EMUI系统
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setPackage("com.huawei.systemmanager");
            intent.setComponent(new ComponentName("com.huawei.systemmanager",
            "com.huawei.systemmanager.puremode.PureModeActivity"));
            PackageManager packageManager = context.getPackageManager();
            List<ResolveInfo> list = packageManager.queryIntentActivities(intent, 
            PackageManager.MATCH_DEFAULT_ONLY);
            return list.size() > 0;

        } catch (Throwable e) {
            e.printStackTrace();
            return false;
        }
    }

     经过测试,上述方案在Harmony系统EMUI系统的华为与荣耀手机中,是可以正确判断出是否是Harmony系统,当然在非华为/荣耀手机中能够更加快速地判断出是非鸿蒙系统。
在这里插入图片描述

二、方案2:通过华为提供的特有类来判断系统品牌

     京东在鸿蒙系统一出来就推出了适配鸿蒙系统的app, 想必肯定是在原有的京东android app的基础上增加调用鸿蒙系统独有的功能特性而已,因为要想整个app重新用Harmony Api去开发,肯定是没法这么快就推出了的,那么京东app里面应该会存在判断是否是鸿蒙系统的代码,结果下载京东app一探究竟,发现还真有判断代码:

 private static final String HARMONY_OS = "harmony";
    /**
     * check the system is harmony os
     *
     * @return true if it is harmony os
     */
    public static boolean isHarmonyOS() {
        try {
            Class clz = Class.forName("com.huawei.system.BuildEx");
            Method method = clz.getMethod("getOsBrand");
            return HARMONY_OS.equals(method.invoke(clz));
        } catch (Exception e) {
           e.printStackTrace();
        }
        return false;
    }

测试上述代码,发现也是可以完美地判断出是Android系统或者是Harmony 系统,真是前人栽树,后人乘凉!
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐