Android透明狀態(tài)欄與狀態(tài)欄文字顏色更改

讀完本篇能夠了解的內(nèi)容      
1.狀態(tài)欄顏色設(shè)置
2.狀態(tài)欄文字顏色設(shè)置
3.滑動過程中蠢护,動態(tài)變化狀態(tài)欄與文字顏色

應(yīng)評論區(qū)小伙伴要求惕蹄,從項目中抽離出一個demo供大家參考绎狭,這個demo布局中沒有用fitsSystemWindows=true這個屬性关带,而寫本篇文章時用了這個屬性侥涵,這個屬性在國內(nèi)某些品牌手機上會不生效,所以demo就重新整理了一下宋雏。整理不易芜飘,如覺有用,歡迎star磨总。
透明狀態(tài)欄demo嗦明。

需求背景

因為我們產(chǎn)品的標題欄是白色,所以狀態(tài)欄也得改成白色舍败,這時就需要把狀態(tài)欄文字顏色改成深色,于是就只考慮6.0以上的狀態(tài)欄樣式修改了敬拓。

所以注意邻薯,本篇文章最終解決的問題是:
Android6.0以上狀態(tài)欄顏色與狀態(tài)欄圖標文字顏色的適配更改,如果需要在4.4以上就進行適配的話乘凸,本文可以做為參考厕诡。

廢話不多說,先放幾張最終測試版本的公司產(chǎn)品的截圖上來营勤。

積分
我的
我的滑動后樣式

接下來我們一步一步來完成整個過程

狀態(tài)欄顏色的修改

/**
 * 修改狀態(tài)欄顏色灵嫌,支持4.4以上版本
 * @param activity
 * @param colorId
 */
public static void setStatusBarColor(Activity activity, int colorId) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = activity.getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(activity.getResources().getColor(colorId));
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        //使用SystemBarTint庫使4.4版本狀態(tài)欄變色,需要先將狀態(tài)欄設(shè)置為透明
        transparencyBar(activity);
        SystemBarTintManager tintManager = new SystemBarTintManager(activity);
        tintManager.setStatusBarTintEnabled(true);
        tintManager.setStatusBarTintResource(colorId);
    }
}

通過代碼葛作,我們可以了解到在Android5.0以上寿羞,可以直接通過以下兩句代碼實現(xiàn)狀態(tài)欄顏色更改。而4.4至5.0這區(qū)間的版本號需要用到SystemBarTintManager這個輔助類赂蠢。而本文主要講述6.0以上的配置绪穆,所以只需要關(guān)系以下兩句代碼,其他就不展開了虱岂。

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(colorId));

狀態(tài)欄文字顏色修改

狀態(tài)欄文字顏色的更改玖院,稍微有點麻煩,分為谷歌原生方式第岖、小米难菌、魅族三種情況進行修改。不過我們也一步一步來實現(xiàn)蔑滓,始終相信郊酒,復雜源自簡單遇绞。

谷歌原生方式修改

谷歌原生方式改變狀態(tài)欄文字顏色,非常簡單猎塞。

private static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
    View decor = activity.getWindow().getDecorView();
    if (dark) {
        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    } else {
        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    }
}

其實就是DecorView兩個不同的標志位之間的切換:
SYSTEM_UI_FLAG_LIGHT_STATUS_BAR , SYSTEM_UI_FLAG_LAYOUT_STABLE

這里有個注意點:
一旦用谷歌原生設(shè)置狀態(tài)欄文字顏色的方法進行設(shè)置的話试读,因為一直會攜帶SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN這個flag,那么默認界面會變成全屏模式荠耽,需要在根布局中設(shè)置FitsSystemWindows屬性為true钩骇,所以我在基類的 process方法中加入如下的代碼。

@Override
protected void process(Bundle savedInstanceState) {
    // 華為,OPPO機型在StatusBarUtil.setLightStatusBar后布局被頂?shù)綘顟B(tài)欄上去了
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        View content = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
        if (content != null && !isUseFullScreenMode()) {
            content.setFitsSystemWindows(true);
        }
    }
}

或者在xml文件的根布局中去添加如下代碼:

android:fitsSystemWindows="true"
小米系統(tǒng)下狀態(tài)欄文字顏色的修改
public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
    boolean result = false;
    Window window = activity.getWindow();
    if (window != null) {
        Class clazz = window.getClass();
        try {
            int darkModeFlag = 0;
            Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            darkModeFlag = field.getInt(layoutParams);
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            if (dark) {
                extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//狀態(tài)欄透明且黑色字體
            } else {
                extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字體
            }
            result = true;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && RomUtils.isMiUIV7OrAbove()) {
                //開發(fā)版 7.7.13 及以后版本采用了系統(tǒng)API铝量,舊方法無效但不會報錯倘屹,所以兩個方式都要加上
                if (dark) {
                    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                }
            }
        } catch (Exception e) {

        }
    }
    return result;
}
魅族系統(tǒng)狀態(tài)欄文字顏色修改
private static boolean setFlymeLightStatusBar(Activity activity, boolean dark) {
    boolean result = false;
    if (activity != null) {
        try {
            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
            Field darkFlag = WindowManager.LayoutParams.class
                    .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
            Field meizuFlags = WindowManager.LayoutParams.class
                    .getDeclaredField("meizuFlags");
            darkFlag.setAccessible(true);
            meizuFlags.setAccessible(true);
            int bit = darkFlag.getInt(null);
            int value = meizuFlags.getInt(lp);
            if (dark) {
                value |= bit;
            } else {
                value &= ~bit;
            }
            meizuFlags.setInt(lp, value);
            activity.getWindow().setAttributes(lp);
            result = true;
        } catch (Exception e) {
        }
    }
    return result;
}

設(shè)置狀態(tài)欄透明,啟用全屏模式

@TargetApi(19)
public static void transparencyBar(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = activity.getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window window = activity.getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}

目前為止慢叨,有兩處可能會將屏幕設(shè)置為全屏模式纽匙,一處是用谷歌原生修改方式,一處就是這里調(diào)用如上方法transparencyBar拍谐。但是只有這里是我們真的需要將屏幕設(shè)置為全屏模式烛缔。所以你應(yīng)該注意到了我在上面那段代碼中setFitsSystemWindows時增加了一個判斷條件isUseFullScreenMode

if (content != null && !isUseFullScreenMode()) {
    content.setFitsSystemWindows(true);
}

判斷不同廠商系統(tǒng)

既然小米和魅族需要區(qū)別對待轩拨,那么就得判斷不同廠商的系統(tǒng)践瓷。小米是在MIUI6以上就可以對文字顏色進行修改

小米系統(tǒng)判斷
private static boolean isMiUIV6OrAbove() {
    try {
        final Properties properties = new Properties();
        properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
        String uiCode = properties.getProperty(KEY_MIUI_VERSION_CODE, null);
        if (uiCode != null) {
            int code = Integer.parseInt(uiCode);
            return code >= 4;
        } else {
            return false;
        }

    } catch (final Exception e) {
        return false;
    }

}
魅族系統(tǒng)判斷
private static boolean isFlymeV4OrAbove() {
    String displayId = Build.DISPLAY;
    if (!TextUtils.isEmpty(displayId) && displayId.contains("Flyme")) {
        String[] displayIdArray = displayId.split(" ");
        for (String temp : displayIdArray) {
            //版本號4以上,形如4.x.
            if (temp.matches("^[4-9]\\.(\\d+\\.)+\\S*")) {
                return true;
            }
        }
    }
    return false;
}

到此基本上所有功能就可以通過以上方式進行串聯(lián)起來了亡蓉。

后話

貼出我在基類中幾個比較重要的方法:

@Override
protected void process(Bundle savedInstanceState) {
    // 華為,OPPO機型在StatusBarUtil.setLightStatusBar后布局被頂?shù)綘顟B(tài)欄上去了
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        View content = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
        if (content != null && !isUseFullScreenMode()) {
            content.setFitsSystemWindows(true);
        }
    }
}

// 在setContentView之前執(zhí)行
@Override
public void setStatusBar() {
    /*
     為統(tǒng)一標題欄與狀態(tài)欄的顏色晕翠,我們需要更改狀態(tài)欄的顏色,而狀態(tài)欄文字顏色是在android 6.0之后才可以進行更改
     所以統(tǒng)一在6.0之后進行文字狀態(tài)欄的更改
    */
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (isUseFullScreenMode()) {
            StatusBarUtil.transparencyBar(this);
        } else {
            StatusBarUtil.setStatusBarColor(this, setStatusBarColor());
        }

        if (isUserLightMode()) {
            StatusBarUtil.setLightStatusBar(this, true);
        }
    }

}

// 是否設(shè)置成透明狀態(tài)欄砍濒,即就是全屏模式
protected boolean isUseFullScreenMode() {
    return false;
}

protected int setStatusBarColor() {
    return R.color.white_1;
}

// 是否改變狀態(tài)欄文字顏色為黑色淋肾,默認為黑色
protected boolean isUserLightMode() {
    return true;
}

以上兩個復寫方法都會在oncreate中執(zhí)行。

接下來是工具類幾個方法

@TargetApi(19)
public static void transparencyBar(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = activity.getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window window = activity.getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}

/**
 * 修改狀態(tài)欄顏色爸邢,支持4.4以上版本
 *
 * @param activity
 * @param colorId
 */
public static void setStatusBarColor(Activity activity, int colorId) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = activity.getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(activity.getResources().getColor(colorId));
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        //使用SystemBarTint庫使4.4版本狀態(tài)欄變色樊卓,需要先將狀態(tài)欄設(shè)置為透明
        transparencyBar(activity);
        SystemBarTintManager tintManager = new SystemBarTintManager(activity);
        tintManager.setStatusBarTintEnabled(true);
        tintManager.setStatusBarTintResource(colorId);
    }
}

/**
*  修改狀態(tài)欄文字顏色,這里小米杠河,魅族區(qū)別對待简识。
*/
public static void setLightStatusBar(final Activity activity, final boolean dark) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        switch (RomUtils.getLightStatusBarAvailableRomType()) {
            case RomUtils.AvailableRomType.MIUI:
                MIUISetStatusBarLightMode(activity, dark);
                break;

            case RomUtils.AvailableRomType.FLYME:
                setFlymeLightStatusBar(activity, dark);

                break;

            case RomUtils.AvailableRomType.ANDROID_NATIVE:
                setAndroidNativeLightStatusBar(activity, dark);
                break;

        }
    }
}


public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
    boolean result = false;
    Window window = activity.getWindow();
    if (window != null) {
        Class clazz = window.getClass();
        try {
            int darkModeFlag = 0;
            Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            darkModeFlag = field.getInt(layoutParams);
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            if (dark) {
                extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//狀態(tài)欄透明且黑色字體
            } else {
                extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字體
            }
            result = true;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && RomUtils.isMiUIV7OrAbove()) {
                //開發(fā)版 7.7.13 及以后版本采用了系統(tǒng)API,舊方法無效但不會報錯感猛,所以兩個方式都要加上
                if (dark) {
                    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                }
            }
        } catch (Exception e) {

        }
    }
    return result;
}

private static boolean setFlymeLightStatusBar(Activity activity, boolean dark) {
    boolean result = false;
    if (activity != null) {
        try {
            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
            Field darkFlag = WindowManager.LayoutParams.class
                    .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
            Field meizuFlags = WindowManager.LayoutParams.class
                    .getDeclaredField("meizuFlags");
            darkFlag.setAccessible(true);
            meizuFlags.setAccessible(true);
            int bit = darkFlag.getInt(null);
            int value = meizuFlags.getInt(lp);
            if (dark) {
                value |= bit;
            } else {
                value &= ~bit;
            }
            meizuFlags.setInt(lp, value);
            activity.getWindow().setAttributes(lp);
            result = true;
        } catch (Exception e) {
        }
    }
    return result;
}

private static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
    View decor = activity.getWindow().getDecorView();
    if (dark) {
        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    } else {
        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    }
}

重點踩過的坑

第一個 滑動過程狀態(tài)欄文字顏色發(fā)生變化時卡頓
解決思路:這類型問題因為有現(xiàn)象七扰,可以看看去掉哪部分代碼后,如果不卡頓了陪白,那么基本上就是那部分代碼的問題颈走;

一般產(chǎn)生的原因:主線程中各類耗時操作,io流咱士,網(wǎng)絡(luò)請求立由,數(shù)據(jù)庫轧钓,大量計算,大量垃圾對象產(chǎn)生引起的gc回收锐膜。

解決過程

1.最開始定位到判斷機型的代碼引起的卡頓毕箍,就嘗試用線程池加載這部分代碼〉勒担卡頓稍微好一些了而柑。(這里又埋了一個坑,待會兒講)

2.繼續(xù)追蹤代碼荷逞,發(fā)現(xiàn)判斷機型的代碼開啟了一個io流的操作

private static boolean isMIUIV6OrAbove() {
    String miuiVersionCodeStr = getSystemProperty("ro.miui.ui.version.code");
    if (!TextUtils.isEmpty(miuiVersionCodeStr)) {
        try {
            int miuiVersionCode = Integer.parseInt(miuiVersionCodeStr);
            if (miuiVersionCode >= 4) {
                return true;
            }
        } catch (Exception e) {}
    }
    return false;
}

private static String getSystemProperty(String propName) {
    String line;
    BufferedReader input = null;
    try {
        Process p = Runtime.getRuntime().exec("getprop " + propName);
        input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
        line = input.readLine();
        input.close();
    } catch (IOException ex) {
        return null;
    } finally {
        if (input != null) {
            try {
                input.close();
            } catch (IOException e) {
            }
        }
    }
    return line;
}

將其用另外的方法替換

private static boolean isMiUIV6OrAbove() {
    try {
        final Properties properties = new Properties();
        properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
        String uiCode = properties.getProperty(KEY_MIUI_VERSION_CODE, null);
        if (uiCode != null) {
            int code = Integer.parseInt(uiCode);
            return code >= 4;
        } else {
            return false;
        }

    } catch (final Exception e) {
        return false;
    }

}

到此卡頓問題得到完美解決媒咳。


第二個,小米mix2手機加載部分界面時种远,界面變成一篇空白
思路和之前一樣涩澡,一步一步排查到問題代碼。還記得之前為了解決卡頓坠敷,在setLightStatusBar方法中加入了一個線程池進行操作妙同,把線程池去掉后,異常消失膝迎。之所以定位到這里粥帚,當時猜測的原因是高版本小米手機改變文字顏色為深色是用的谷歌原生方法修改,這里可能需要在setContentView之前調(diào)用弄抬,但是放入線程池當中就不能保證兩者的執(zhí)行先后順序了茎辐。

總結(jié)

6.0改變文字顏色代碼谷歌原生代碼
View decor = activity.getWindow().getDecorView();
if (dark) {
    decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
   decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}

小米和魅族需要單獨調(diào)用其各自的修改代碼(見最開始上面代碼)宪郊,小米在miui7之后又用了谷歌原生調(diào)用方法掂恕。谷歌原生調(diào)用方法會導致全屏模式,所以需要設(shè)置FitsSystemWindows屬性

5.0以上改變狀態(tài)欄顏色代碼
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(colorId));
5.0后設(shè)置為全屏模式弛槐,就是透明狀態(tài)欄

首頁一般都是四個fragment的tab懊亡,這時可能一個需要全屏模式,那么將這個首頁的activity設(shè)置為全屏模式后乎串,四個tab都是全屏模式了店枣,這時需要手動給不需要全屏模式的幾個fragment添加一個狀態(tài)欄高度的view。

Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

RomUtils類

因為有很人在要romutils中的代碼叹誉,之前沒有想到這一塊會給大伙帶來問題⊙炝剑現(xiàn)貼出整個代碼如下:

public class RomUtils {
    class AvailableRomType {
        public static final int MIUI = 1;
        public static final int FLYME = 2;
        public static final int ANDROID_NATIVE = 3;
        public static final int NA = 4;
    }

    public static int getLightStatusBarAvailableRomType() {
        //開發(fā)版 7.7.13 及以后版本采用了系統(tǒng)API,舊方法無效但不會報錯
        if (isMiUIV7OrAbove()) {
            return AvailableRomType.ANDROID_NATIVE;
        }

        if (isMiUIV6OrAbove()) {
            return AvailableRomType.MIUI;
        }

        if (isFlymeV4OrAbove()) {
            return AvailableRomType.FLYME;
        }

        if (isAndroidMOrAbove()) {
            return AvailableRomType.ANDROID_NATIVE;
        }

        return AvailableRomType.NA;
    }

    //Flyme V4的displayId格式為 [Flyme OS 4.x.x.xA]
    //Flyme V5的displayId格式為 [Flyme 5.x.x.x beta]
    private static boolean isFlymeV4OrAbove() {
        String displayId = Build.DISPLAY;
        if (!TextUtils.isEmpty(displayId) && displayId.contains("Flyme")) {
            String[] displayIdArray = displayId.split(" ");
            for (String temp : displayIdArray) {
                //版本號4以上长豁,形如4.x.
                if (temp.matches("^[4-9]\\.(\\d+\\.)+\\S*")) {
                    return true;
                }
            }
        }
        return false;
    }

    //Android Api 23以上
    private static boolean isAndroidMOrAbove() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
    }

    private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";

    private static boolean isMiUIV6OrAbove() {
        try {
            final Properties properties = new Properties();
            properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
            String uiCode = properties.getProperty(KEY_MIUI_VERSION_CODE, null);
            if (uiCode != null) {
                int code = Integer.parseInt(uiCode);
                return code >= 4;
            } else {
                return false;
            }

        } catch (final Exception e) {
            return false;
        }

    }

    static boolean isMiUIV7OrAbove() {
        try {
            final Properties properties = new Properties();
            properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
            String uiCode = properties.getProperty(KEY_MIUI_VERSION_CODE, null);
            if (uiCode != null) {
                int code = Integer.parseInt(uiCode);
                return code >= 5;
            } else {
                return false;
            }

        } catch (final Exception e) {
            return false;
        }

    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钧唐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匠襟,更是在濱河造成了極大的恐慌钝侠,老刑警劉巖该园,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帅韧,居然都是意外死亡里初,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門忽舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來双妨,“玉大人,你說我怎么就攤上這事萧诫〕饽眩” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵帘饶,是天一觀的道長哑诊。 經(jīng)常有香客問我,道長及刻,這世上最難降的妖魔是什么镀裤? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮缴饭,結(jié)果婚禮上暑劝,老公的妹妹穿的比我還像新娘。我一直安慰自己颗搂,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布傅联。 她就那樣靜靜地躺著蒸走,像睡著了一般貌嫡。 火紅的嫁衣襯著肌膚如雪岛抄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天掸掸,我揣著相機與錄音猾漫,去河邊找鬼。 笑死粒督,一個胖子當著我的面吹牛屠橄,可吹牛的內(nèi)容都是我干的闰挡。 我是一名探鬼主播长酗,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼夺脾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚀乔?” 一聲冷哼從身側(cè)響起吉挣,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤睬魂,失蹤者是張志新(化名)和其女友劉穎汉买,沒想到半個月后佩脊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體威彰,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡歇盼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年豹缀,在試婚紗的時候發(fā)現(xiàn)自己被綠了邢笙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡叮雳,死狀恐怖帘不,靈堂內(nèi)的尸體忽然破棺而出杨箭,到底是詐尸還是另有隱情互婿,我是刑警寧澤擒悬,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站侈净,受9級特大地震影響僧凤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旋膳,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尸变。 院中可真熱鬧,春花似錦碱工、人聲如沸历筝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽电抚。三九已至,卻和暖如春俺祠,著一層夾襖步出監(jiān)牢的瞬間蜘渣,已是汗流浹背蔫缸。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工拾碌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留校翔,地道東北人灾前。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓蔫敲,卻偏偏與公主長得像烧给,于是被迫代替她去往敵國和親喝噪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 用到的組件 1、通過CocoaPods安裝 2盗似、第三方類庫安裝 3平项、第三方服務(wù) 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,601評論 1 180
  • 我掛掉電話荔燎,手機發(fā)燙销钝,通話時間一個半小時蒸健,對面烈焰紅唇的女同事瞪著一雙眼睛說:“喲纵装,沒想到程序員也有話這么多的時候...
    優(yōu)才學院閱讀 1,195評論 0 0
  • 昨天開始滤祖,起風了,天氣一下子從炎熱難耐的夏季瞬間變得涼颼颼瓶籽,每個人都穿上了長袖或是外套匠童。今天是國慶假期的第一天,放...
    雅然愛寫作閱讀 215評論 0 0
  • 有一小伙伴約去夜騎塑顺,上班時就盤算著去哪里汤求,要不要約一些人一起呢俏险,心里暗暗的想著。因為之前有幾個警衛(wèi)問我去騎車為什么...
    田田拾光閱讀 313評論 0 4