import Activity from 'android.app.Activity'; import Configuration from 'android.content.res.Configuration'; import Context from 'android.content.Context'; import UiModeManager from 'android.app.UiModeManager'; import WindowManager from 'android.view.WindowManager'; import DisplayMetrics from 'android.util.DisplayMetrics'; import Build from 'android.os.Build'; import File from 'java.io.File'; import { EmulatorCheckUtil } from './EmulatorCheckUtil.uts' import TextUtils from 'android.text.TextUtils'; import BufferedReader from 'java.io.BufferedReader'; import InputStreamReader from 'java.io.InputStreamReader'; import Exception from 'java.lang.Exception'; import KotlinArray from 'kotlin.Array' export class DeviceUtil { private static customOS: string | null = null private static customOSVersion: string | null = null private static readonly rootRelatedDirs = [ "/su", "/su/bin/su", "/sbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/data/local/su", "/system/xbin/su", "/system/bin/su", "/system/sd/xbin/su", "/system/bin/failsafe/su", "/system/bin/cufsdosck", "/system/xbin/cufsdosck", "/system/bin/cufsmgr", "/system/xbin/cufsmgr", "/system/bin/cufaevdd", "/system/xbin/cufaevdd", "/system/bin/conbb", "/system/xbin/conbb"]; /** * HarmonyOS 系统输出的 * 格式:2.0.0 */ private static KEY_HARMONYOS_VERSION_NAME = "hw_sc.build.platform.version"; /** * EMUI系统输出的 * 格式:EmotionUI_8.0.0 */ private static KEY_EMUI_VERSION_NAME = "ro.build.version.emui"; /** * MagicUI系统输出的 * 格式:3.1.0 */ private static KEY_MAGICUI_VERSION = "ro.build.version.magic"; /** * MIUI系统输出的 * 格式:V12 */ private static KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name"; /** * OPPO手机ColorOS系统输出的 * 格式:9 */ private static KEY_COLOROS_VERSION_NAME = "ro.build.version.opporom"; /** * VIVO手机系统输出的 * name格式:funtouch * version格式: 9 */ private static KEY_VIVO_VERSION_NAME = "ro.vivo.os.name"; private static KEY_VIVO_VERSION = "ro.vivo.os.version"; /** * OonPlus手机系统输出的 * 格式:Hydrogen OS 11.0.7.10.KB05 */ private static KEY_ONEPLUS_VERSION_NAME = "ro.rom.version"; /** * 魅族手机系统输出的 */ private static KEY_FLYME_VERSION_NAME = "ro.build.display.id"; /** * nubia手机系统输出的 */ private static KEY_NUBIA_VERSION_NAME = "ro.build.nubia.rom.name"; private static KEY_NUBIA_VERSION_CODE = "ro.build.nubia.rom.code"; public static getOrientation(activity: Activity): string { const activityOrientation = activity.getResources().getConfiguration().orientation; let outOrientation = "portrait"; if (activityOrientation == Configuration.ORIENTATION_LANDSCAPE) { outOrientation = "landscape"; } return outOrientation; } /** * 获取屏幕像素比 */ public static getScaledDensity(activity: Activity): number { const windowManager = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager; const displayMetrics = new DisplayMetrics(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { windowManager.getDefaultDisplay().getRealMetrics(displayMetrics); } else { windowManager.getDefaultDisplay().getMetrics(displayMetrics); } return displayMetrics.scaledDensity; } public static getSystemUIModeType(activity: Activity): string { let uiModeManager = activity.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager; let modeType = "unknown"; switch (uiModeManager.getCurrentModeType()) { case Configuration.UI_MODE_TYPE_TELEVISION: modeType = "tv"; break; case Configuration.UI_MODE_TYPE_WATCH: modeType = "watch"; break; case Configuration.UI_MODE_TYPE_NORMAL: if (DeviceUtil.isTablet(activity)) { modeType = "pad"; } else { modeType = "phone"; } break; case Configuration.UI_MODE_TYPE_DESK: modeType = "pc"; break; case Configuration.UI_MODE_TYPE_UNDEFINED: modeType = "undefined"; break; case Configuration.UI_MODE_TYPE_CAR: modeType = "car"; break; case Configuration.UI_MODE_TYPE_VR_HEADSET: modeType = "vr"; break; case Configuration.UI_MODE_TYPE_APPLIANCE: modeType = "appliance"; break; } return modeType; } /** * 是否root */ public static hasRootPrivilege(): boolean { let hasRootDir = false; let rootDirs = DeviceUtil.rootRelatedDirs; let dirCount = rootDirs.length; let i = 0; while (i < dirCount) { let dir = rootDirs[i]; if ((new File(dir)).exists()) { hasRootDir = true; break; } i++; } return Build.TAGS != null && Build.TAGS.includes("test-keys") || hasRootDir; } public static isSimulator(context: Context): boolean { return EmulatorCheckUtil.getSingleInstance().emulatorCheck(context); } public static getDeviceID(context: Context): string { return UTSAndroid.getDeviceID(context); } public static getOsLanguage(context: Context): string { return UTSAndroid.getLanguageInfo(context)["osLanguage"].toString(); } public static getOsLanguageNormal(context: Context): string { const LOCALE_ZH_HANS = 'zh-Hans' const LOCALE_ZH_HANT = 'zh-Hant' let locale = UTSAndroid.getLanguageInfo(context)["appLanguage"].toString(); if (locale.indexOf('zh') === 0) { if (locale.indexOf('-hans') > -1) { return LOCALE_ZH_HANS; } if (locale.indexOf('-hant') > -1) { return LOCALE_ZH_HANT; } if (locale.includes("-tw") || locale.includes("-hk") || locale.includes("-mo") || locale.includes("-cht")) { return LOCALE_ZH_HANT; } return LOCALE_ZH_HANS; } else { return locale; } } public static getAppInnerVersion(): string { return UTSAndroid.getInnerVersion(); } public static getOaid(): string { return UTSAndroid.getOAID(); } /** * 是否为平板 不是太准确 */ public static isTablet(activity: Activity): boolean { return (activity.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; } private static setCustomInfo(phoneBrand: string) { try { switch (DeviceUtil.deleteSpaceAndToUpperCase(phoneBrand)) { case "HUAWEI": if (DeviceUtil.isHarmonyOS()) { DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_HARMONYOS_VERSION_NAME); DeviceUtil.customOS = "HarmonyOS"; } else { DeviceUtil.customOS = "EMUI"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_EMUI_VERSION_NAME);; } break; case "HONOR": if (DeviceUtil.isHarmonyOS()) { DeviceUtil.customOS = "HarmonyOS"; if (!TextUtils.isEmpty(DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_HARMONYOS_VERSION_NAME))) { DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_HARMONYOS_VERSION_NAME);; } else { DeviceUtil.customOSVersion = ""; } } else if (!TextUtils.isEmpty(DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_MAGICUI_VERSION))) { DeviceUtil.customOS = "MagicUI"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_MAGICUI_VERSION); } else { //格式:EmotionUI_8.0.0 DeviceUtil.customOS = "EMUI"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_EMUI_VERSION_NAME); } break; case "XIAOMI": case "REDMI": //格式:MIUIV12 DeviceUtil.customOS = "MIUI"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_MIUI_VERSION_NAME); break; case "REALME": case "OPPO": //格式:ColorOSV2.1 DeviceUtil.customOS = "ColorOS"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_COLOROS_VERSION_NAME); break; case "VIVO": //格式:Funtouch9 DeviceUtil.customOS = "Funtouch"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_VIVO_VERSION); break; case "ONEPLUS": //格式:Hydrogen OS 11.0.7.10.KB05 DeviceUtil.customOS = "HydrogenOS"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_ONEPLUS_VERSION_NAME); break; case "MEIZU": //格式:Flyme 6.3.5.1G DeviceUtil.customOS = "Flyme"; DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_FLYME_VERSION_NAME); break; case "NUBIA": //格式:nubiaUIV3.0 DeviceUtil.customOS = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_NUBIA_VERSION_NAME); DeviceUtil.customOSVersion = DeviceUtil.getSystemPropertyValue(DeviceUtil.KEY_NUBIA_VERSION_CODE); break; default: DeviceUtil.customOS = "Android"; DeviceUtil.customOSVersion = Build.VERSION.RELEASE; break; } } catch (e: Exception) { } } /** * 判断是否是华为鸿蒙系统,能否识别荣耀鸿蒙未知 * * @return */ private static isHarmonyOS(): boolean { try { let classType = Class.forName("com.huawei.system.BuildEx"); let getMethod = classType.getMethod("getOsBrand"); let value = getMethod.invoke(classType) as string; return !TextUtils.isEmpty(value); } catch (e: Exception) { return false; } } /** * 删除字符串中的空格并全部转成大写 * @param str * @return */ public static deleteSpaceAndToUpperCase(str: string | null): string { if (TextUtils.isEmpty(str)) { return ""; } return str!.replace(" ", "").toUpperCase(); } private static getSystemPropertyValue(propName: string): string | null { let value: string | null = null; let roSecureObj: any | null; try { // Class.forName("java.lang.String") const method = Class.forName("android.os.SystemProperties").getMethod("get", Class.forName("java.lang.String")); roSecureObj = method.invoke(null, propName); if (roSecureObj != null) { value = roSecureObj as string; } } catch (e: Exception) { } return value; } public static listeningForADB(): boolean { let cmd : KotlinArray = arrayOf("/bin/sh", "-c", "getprop | grep init.svc.adbd"); try{ Runtime.getRuntime().exec(cmd); }catch(e:Exception){ cmd = arrayOf("/system/bin/sh", "-c", "getprop | grep init.svc.adbd"); try{ Runtime.getRuntime().exec(cmd); }catch(e:Exception){ return false } } let exec = Runtime.getRuntime().exec(cmd); let bufferedReader = new BufferedReader(new InputStreamReader(exec.getInputStream(), "utf-8")); let tmp = new CharArray(1024); let result = false; do { let len = bufferedReader.read(tmp); if (len == -1) { break; } let res = new String(tmp, 0, len); result = res.includes("running"); } while (true) exec.getInputStream().close(); bufferedReader.close(); return result; } }