一般來講,在android程序開發中進行需要判斷設備類型和系統版本
1、設備類型判斷(android.os.Build.MODEL)
比如判斷屬於Google Nexus 5,Nexus 7,MIUI v5, MIUI v6,三星設備,魅族設備等;
這類型的問題都使用的android.os.Build.MODEL來判斷,android.os.Build.MODEL是一個String變量,可以根據String中一些特殊字段來判斷android設備屬於什么設備,比如判斷Nexus 7,代碼入下
public static boolean isN7() { return "Nexus 7".equals(android.os.Build.MODEL); }
所以平時開發過程中如果不知道一個設備的MODEL值,寫個測試程序輸出android.os.Build.MODEL值,然后再將該值用到我么的程序中參與判斷。
2、系統版本判斷(api版本-android.os.Build.VERSION.SDK_INT)
比如判斷系統是屬於2.3, 3.0, 4.4, 5.0 等,這種屬性判斷使用的是系統的android.os.Build.VERSION.SDK_INT變量。
最常用的場景是用來判斷一些系統函數的api版本,比如有些方法只有高版本的api才有,低版本上使用會導致程序崩潰。
但是還有一種場景導致還要第三種方法才能搞定
使用場景:現在操作系統大多是開源的,默認是google 的android系統,但是別忘了還有魅族的Flyme OS 和小米的 Miui,它們是android的變種。如果用非小米手機也裝上了miui,后者是非魅族手機裝上了魅族的Flyme OS,這種情況怎么判斷呢。拿魅族來說:顯然這個時候不能用判斷設備類型的方式,因為非魅族設備安裝了魅族系統。所以這個時候只能判斷這個操作系統是魅族的Flyme OS,它的操作系統應該具備一些它自己的特性,所以只要找到一個唯一的特性就可以解決上面的問題了。
3、判斷特殊的操作系統---獲取系統屬性加以研究(魅族為例)
進入adb shell,獲取魅族系統屬性:
- 首先進入cmd,然后輸入adb shell 命令進入adb shell (前提:adb必須要配置到系統環境變量中)
C:\Users\Administrator>adb shell
shell@mx4pro:/ $
shell@mx4pro:/ $
- 進入system目錄
shell@mx4pro:/ $ cd system
cd system
shell@mx4pro:/system $
cd system
shell@mx4pro:/system $
- 查看系統屬性
shell@mx4pro:/system $ cat build.prop
cat build.prop
# begin build properties
# autogenerated by buildinfo.sh
ro.build.cta=noncta
ro.build.id=KTU84P
ro.build.mask.id=4.4.4-1423716396_wo
ro.build.args=
ro.build.inside.id=4.4.4-20150212124636
ro.build.version.incremental=m76.Flyme_OS_4.2.2.1.20150212124636
ro.build.version.sdk=19
ro.build.version.codename=REL
ro.build.version.release=4.4.4
cat build.prop
# begin build properties
# autogenerated by buildinfo.sh
ro.build.cta=noncta
ro.build.id=KTU84P
ro.build.mask.id=4.4.4-1423716396_wo
ro.build.args=
ro.build.inside.id=4.4.4-20150212124636
ro.build.version.incremental=m76.Flyme_OS_4.2.2.1.20150212124636
ro.build.version.sdk=19
ro.build.version.codename=REL
ro.build.version.release=4.4.4
.....還有很多
- 篩選包含Flyme字符的屬性,因為既然是魅族操作系統,Flyme這個詞最能代表它的屬性
shell@mx4pro:/system $ cat build.prop | grep Flyme
cat build.prop | grep Flyme
cat build.prop | grep Flyme
ro.build.version.incremental=m76.Flyme_OS_4.2.2.1.20150212124636
ro.build.display.id=Flyme OS 4.2.2.1U
ro.build.description=meizu_mx4pro-user 4.4.4 KTU84P m76.Flyme_OS_4.2.2.1.2015021
2124636 release-keys
ro.build.fingerprint=Meizu/meizu_mx4pro/mx4pro:4.4.4/KTU84P/m76.Flyme_OS_4.2.2.1
.20150212124636:user/release-keys
shell@mx4pro:/system $
帥選到四個屬性:ro.build.version.incremental ro.build.display.id ro.build.description ro.build.fingerprint
- 換一個其他的安裝有魅族操作系統設備,重復上面的步驟。最終會發現 ro.build.display.id這個屬性可以當做一個魅族操作系統唯一的特性(因為這個屬性值幾乎都會包含Flyme字段,這正是我們想要的)。我們就可以用這個屬性來與其他系統進行區分。
- 最后一步,當然是怎么取出這個屬性值了。
4、通過反射調用獲取系統屬性
// 判斷是魅族操作系統 public static boolean isMeizuFlymeOS() { return getMeizuFlymeOSFlag().toLowerCase().contains("flyme"); } /** * 獲取魅族系統操作版本標識 */ public static String getMeizuFlymeOSFlag() { return getSystemProperty("ro.build.display.id", ""); } private static String getSystemProperty(String key, String defaultValue) { try { Class<?> clz = Class.forName("android.os.SystemProperties"); Method get = clz.getMethod("get", String.class, String.class); return (String)get.invoke(clz, key, defaultValue); } catch (Exception e) { } return defaultValue; } // 下面是小米操作系統的一些相關方法 /** * 獲取MIUI版本名 */ public static String getMIUIVersionName() { return getSystemProperty("ro.miui.ui.version.name", null); } // MIUI v5版本 public static boolean isV5(){ if("V5".equalsIgnoreCase(getMIUIVersionName())){ return true; } return false; }
為了方便,封裝一個反射調用系統SystemProperties類的工具類
public class SystemPropertiesReflect { public static String get(String key, String value) { try { Method method = Class.forName("android.os.SystemProperties")
.getMethod("get", String.class, String.class); return (String) method.invoke(null, key, value); } catch (Exception e) { } return value; } public static long getLong(String key, long value) { try { Method method = Class.forName("android.os.SystemProperties")
.getMethod("getLong", String.class, long.class); return (Long) method.invoke(null, key, value); } catch (Exception e) { } return value; } }
