Как я могу определить Samsung One UI? - PullRequest
0 голосов
/ 08 февраля 2020

Фон

Мне нужно обойти ошибку, которая затрагивает только устройства под управлением Один пользовательский интерфейс Samsung .

Вопрос

Как программно обнаружить если на устройстве запущен One UI?

Что я пробовал

Я уже пробовал следующее:

  • Проверка android.os.Build, но я не увидел ничего, что бы четко идентифицировало One UI
  • Проверка, если Build.BRAND == "samsung" && Build.VERSION.SDK_INT >= 28, но это также обнаруживает пользовательские ПЗУ, работающие на устройствах Samsung, которые не запускают One UI

Пример системной информации

Для справки приведем дамп android.os.Build на Samsung Galaxy Tab S4 под управлением Android 9:

Build.BOARD: msm8998
Build.BOOTLOADER: T835XXU4BSJ6
Build.BRAND: samsung
Build.CPU_ABI: arm64-v8a
Build.CPU_ABI2: 
Build.DEVICE: gts4llte
Build.DISPLAY: PPR1.180610.011.T835XXU4BSJ6
Build.FINGERPRINT: samsung/gts4lltexx/gts4llte:9/PPR1.180610.011/T835XXU4BSJ6:user/release-keys
Build.HARDWARE: qcom
Build.HOST: 21HH1G10
Build.ID: PPR1.180610.011
Build.IS_DEBUGGABLE: false
Build.IS_EMULATOR: false
Build.MANUFACTURER: samsung
Build.MODEL: SM-T835
Build.PERMISSIONS_REVIEW_REQUIRED: false
Build.PRODUCT: gts4lltexx
Build.RADIO: unknown
Build.SERIAL: unknown
Build.TAGS: release-keys
Build.TIME: 1572504702000
Build.TYPE: user
Build.UNKNOWN: unknown
Build.USER: dpi
Build.Version.BASE_OS: 
Build.Version.CODENAME: REL
Build.Version.FIRST_SDK_INT: 27
Build.Version.INCREMENTAL: T835XXU4BSJ6
Build.Version.PREVIEW_SDK_INT: 0
Build.Version.RELEASE: 9
Build.Version.RESOURCES_SDK_INT: 28
Build.Version.SDK: 28
Build.Version.SDK_INT: 28
Build.Version.SECURITY_INDEX: 1
Build.Version.SECURITY_PATCH: 2019-11-01
Build.Version.SEM_FIRST_SDK_INT: 27
Build.Version.SEM_INT: 2801
Build.Version.SEM_PLATFORM_INT: 100100

А вот снимок экрана с информацией о системе на устройстве: Samsung Galaxy Tab S4 Android 9 System Information

1 Ответ

1 голос
/ 06 апреля 2020

В основном взято из Samsung SecSettings.apk, с некоторыми размышлениями:

public String getOneUiVersion() throws Exception {
    if (!isSemAvailable(getApplicationContext())) {
        return ""; // was "1.0" originally but probably just a dummy value for one UI devices
    }
    Field semPlatformIntField = Build.VERSION.class.getDeclaredField("SEM_PLATFORM_INT");
    int version = semPlatformIntField.getInt(null) - 90000;
    if (version < 0) {
        // not one ui (could be previous Samsung OS)
        return "";
    }
    return (version / 10000) + "." + ((version % 10000) / 100);
}

public boolean isSemAvailable(Context context) {
    return context != null &&
            (context.getPackageManager().hasSystemFeature("com.samsung.feature.samsung_experience_mobile") ||
                    context.getPackageManager().hasSystemFeature("com.samsung.feature.samsung_experience_mobile_lite"));
}

Первое условие (isSemAvailable) является проблематичным c с устройствами, отличными от Samsung, поэтому, вероятно, лучше его отбросить. Я пробовал это на некоторых устройствах 1.0, и без него все работало нормально.

...