Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I detect Samsung One UI?

Background

I need to work around a bug that only affects devices running Samsung's One UI.

Question

How can I programmatically detect if a device is running One UI?

What I've tried

I've already tried the following:

  • Inspecting android.os.Build, but I didn't see anything that clearly identified One UI
  • Checking if Build.BRAND == "samsung" && Build.VERSION.SDK_INT >= 28, but this also detects custom ROMs running on Samsung devices, which don't run One UI

Example system info

For reference, here is a dump of android.os.Build on a Samsung Galaxy Tab S4 running 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

And here's a screenshot of the system info screen on the device: Samsung Galaxy Tab S4 Android 9 System Information

like image 643
Sam Avatar asked Oct 15 '25 03:10

Sam


1 Answers

Taken mostly from Samsung's SecSettings.apk, with some reflections:

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"));
}

The first condition (isSemAvailable) is problematic with non-Samsung devices so it's probably better to drop it. I tried it with some 1.0 devices and it worked fine without it.

like image 84
arbuz Avatar answered Oct 18 '25 00:10

arbuz