嘗試解決 Android 適配最后一公里

框架介紹

  • Android 碎片化至始至終是一個(gè)令人非常頭疼的問題,特別為 XXPermissions 上面為不同的廠商做適配的時(shí)候就非常頭疼,因?yàn)槭忻嫔夏苷业降拈_源庫只能判斷機(jī)型的品牌,而不能判斷 Android 廠商定制的系統(tǒng)類型,用機(jī)型的品牌去做適配會(huì)導(dǎo)致出現(xiàn)誤判的情況,例如在小米手機(jī)上面運(yùn)行的廠商系統(tǒng)不一定是 MIUI 或者 HyperOS,也有可能是被人刷成了 Android 原生的系統(tǒng)或者其他,反過來也一樣,我時(shí)常在想,要是有這么一個(gè)工具就好了,可以判斷 Android 廠商系統(tǒng)的類型及獲取廠商系統(tǒng)的版本號(hào),這樣就很方便我們做 Android 適配,于是 DeviceCompat 就誕生了,可以輕松識(shí)別各種國內(nèi)外手機(jī)廠商和系統(tǒng)版本,幫助大家解決 Android 適配最后一公里的問題

  • 截至到目前,我是行業(yè)內(nèi)第一個(gè)也是唯一一個(gè)開源這套方案的人,在這里先感謝網(wǎng)上的同行分享的各種方法和思路,讓我在開發(fā)的過程中少走了很多彎路,另外我也很能理解為什么行業(yè)內(nèi)一直沒有人愿意站出來開源這種框架,因?yàn)檫^程非常麻煩,這不僅僅是一個(gè)技術(shù)問題,還是一個(gè)苦活,因?yàn)橐槍?duì)成千上萬的機(jī)型進(jìn)行適配。

框架亮點(diǎn)

  • 支持識(shí)別各種定制 Android 系統(tǒng)(HarmonyOS、MagicOS、MIUI、HyperOS、ColorOS、OriginOS 等)

  • 支持判斷多種手機(jī)廠商品牌(華為、小米、OPPO、vivo、三星等)

  • 使用簡單,一行代碼即可判斷設(shè)備品牌、廠商系統(tǒng)類型、廠商系統(tǒng)版本

  • 兼容性好,支持 Android 4.0 及以上系統(tǒng)

  • 體積小巧,僅 12 KB,不會(huì)增加應(yīng)用體積負(fù)擔(dān)

集成步驟

  • 如果你的項(xiàng)目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入
allprojects {
    repositories {
        // JitPack 遠(yuǎn)程倉庫:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
  • 如果你的 Gradle 配置是 7.0 及以上,則需要在 settings.gradle 文件中加入
dependencyResolutionManagement {
    repositories {
        // JitPack 遠(yuǎn)程倉庫:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
  • 配置完遠(yuǎn)程倉庫后,在項(xiàng)目 app 模塊下的 build.gradle 文件中加入遠(yuǎn)程依賴
dependencies {
    // 設(shè)備兼容框架:https://github.com/getActivity/DeviceCompat
    implementation 'com.github.getActivity:DeviceCompat:1.0'
}

框架 API 介紹

  • 判斷系統(tǒng)類型
// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 HyperOS(小米新系統(tǒng))
DeviceOs.isHyperOs();
// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為國內(nèi)版本的 HyperOS
DeviceOs.isHyperOsByChina();
// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為國際版本的 HyperOS
DeviceOs.isHyperOsByGlobal();
// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)開啟了 HyperOS 的系統(tǒng)優(yōu)化選項(xiàng)
DeviceOs.isHyperOsOptimization();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 MIUI(小米老系統(tǒng))
DeviceOs.isMiui();
// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為國內(nèi)版本的 MIUI
DeviceOs.isMiuiByChina();
// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為國際版本的 MIUI
DeviceOs.isMiuiByGlobal();
// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否開啟了 MIUI 優(yōu)化選項(xiàng)
DeviceOs.isMiuiOptimization();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 RealmeUI(真我系統(tǒng))
DeviceOs.isRealmeUi();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 ColorOS(OPPO 系統(tǒng))
DeviceOs.isColorOs();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 OriginOS(VIVO 系統(tǒng))
DeviceOs.isOriginOs();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 FuntouchOS(VIVO 的老系統(tǒng))
DeviceOs.isFuntouchOs();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 MagicOS(榮耀系統(tǒng))
DeviceOs.isMagicOs();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 HarmonyOS(華為鴻蒙的系統(tǒng))
DeviceOs.isHarmonyOs();      

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 EMUI(華為和榮耀的老系統(tǒng))
DeviceOs.isEmui();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 OneUI(三星系統(tǒng))
DeviceOs.isOneUi();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 OxygenOS(一加的老系統(tǒng))
DeviceOs.isOxygenOs();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 H2OS(一加的老系統(tǒng))
DeviceOs.isH2Os();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 Flyme(魅族系統(tǒng))
DeviceOs.isFlyme();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 MyOS(中興或者努比亞的系統(tǒng))
DeviceOs.isMyOs();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 MifavorUI(中興老系統(tǒng))
DeviceOs.isMifavorUi();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 SmartisanOS(錘子系統(tǒng))
DeviceOs.isSmartisanOs();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 EUI(樂視的系統(tǒng))
DeviceOs.isEui();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 ZUI(摩托羅拉的系統(tǒng))
DeviceOs.isZui();

// 判斷當(dāng)前設(shè)備的廠商系統(tǒng)是否為 360UI(360 系統(tǒng))
DeviceOs.is360Ui();

// 獲取當(dāng)前設(shè)備的廠商系統(tǒng)名稱
DeviceOs.getOsName();

// 獲取當(dāng)前設(shè)備的廠商系統(tǒng)名稱
DeviceOs.getOsName();
// 獲取經(jīng)過美化的廠商系統(tǒng)版本號(hào)
DeviceOs.getOsVersionName();
// 獲取廠商系統(tǒng)版本的大版本號(hào)
DeviceOs.getOsBigVersionCode();
// 獲取原始的廠商系統(tǒng)版本號(hào)
DeviceOs.getOriginalOsVersionName();
  • 判斷設(shè)備品牌
// 判斷當(dāng)前設(shè)備的品牌是否為華為
DeviceBrand.isHuaWei();

// 判斷當(dāng)前設(shè)備的品牌是否為榮耀
DeviceBrand.isHonor();

// 判斷當(dāng)前設(shè)備的品牌是否為 vivo
DeviceBrand.isVivo();

// 判斷當(dāng)前設(shè)備的品牌是否為小米
DeviceBrand.isXiaoMi();

// 判斷當(dāng)前設(shè)備的品牌是否為 OPPO
DeviceBrand.isOppo();

// 判斷當(dāng)前設(shè)備的品牌是否為真我
DeviceBrand.isRealMe();

// 判斷當(dāng)前設(shè)備的品牌是否為樂視
DeviceBrand.isLeEco();

// 判斷當(dāng)前設(shè)備的品牌是否為 360
DeviceBrand.is360();

// 判斷當(dāng)前設(shè)備的品牌是否為中興
DeviceBrand.isZte();

// 判斷當(dāng)前設(shè)備的品牌是否為一加
DeviceBrand.isOnePlus();

// 判斷當(dāng)前設(shè)備的品牌是否為努比亞
DeviceBrand.isNubia();

// 判斷當(dāng)前設(shè)備的品牌是否為酷派
DeviceBrand.isCoolPad();

// 判斷當(dāng)前設(shè)備的品牌是否為 LG
DeviceBrand.isLg();

// 判斷當(dāng)前設(shè)備的品牌是否為 Google
DeviceBrand.isGoogle();

// 判斷當(dāng)前設(shè)備的品牌是否為三星
DeviceBrand.isSamsung();

// 判斷當(dāng)前設(shè)備的品牌是否為魅族
DeviceBrand.isMeiZu();

// 判斷當(dāng)前設(shè)備的品牌是否為聯(lián)想
DeviceBrand.isLenovo();

// 判斷當(dāng)前設(shè)備的品牌是否為錘子
DeviceBrand.isSmartisan();

// 判斷當(dāng)前設(shè)備的品牌是否為 HTC
DeviceBrand.isHtc();

// 判斷當(dāng)前設(shè)備的品牌是否為索尼
DeviceBrand.isSony();

// 判斷當(dāng)前設(shè)備的品牌是否為金立
DeviceBrand.isGionee();

// 判斷當(dāng)前設(shè)備的品牌是否為摩托羅拉
DeviceBrand.isMotorola();

// 判斷當(dāng)前設(shè)備的品牌是否為傳音
DeviceBrand.isTranssion();

// 獲取當(dāng)前設(shè)備的品牌名稱
DeviceBrand.getBrandName();
  • 系統(tǒng)屬性相關(guān)的方法
// 獲取單個(gè)系統(tǒng)屬性值
SystemPropertyCompat.getSystemPropertyValue((@Nullable String key);

// 獲取多個(gè)系統(tǒng)屬性值
SystemPropertyCompat.getSystemPropertyValues(@Nullable String[] keys);

// 獲取多個(gè)系統(tǒng)屬性中的任一一個(gè)值
SystemPropertyCompat.getSystemPropertyAnyOneValue(@Nullable String[] keys);

// 判斷某個(gè)系統(tǒng)屬性是否存在
SystemPropertyCompat.isSystemPropertyExist(@Nullable String key);

// 判斷多個(gè)系統(tǒng)屬性是否有任一一個(gè)存在
SystemPropertyCompat.isSystemPropertyAnyOneExist(@Nullable String[] keys);

附上項(xiàng)目開源地址:DeviceCompat

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容