在开发中我们经常会用到一些手机系统信息,如IMEI、IMSI、MAC、SERIALNO等等,下面给出这些信息的一些获取方法
1. android.os.SystemProperties (the access to System Property store)
这是android系统属性的控制类,控制系统的各属性值,用于记录和管理系统的配置和状态。每个属性都以pair(key/value)的形式存储,可以在adb shell下使用getprop查看系统属性(列出部分):
[dhcp.wlan0.dns1]: [172.26.210.1]
[dhcp.wlan0.dns2]: [218.2.135.1]
[dhcp.wlan0.gateway]: [172.26.210.1]
[dhcp.wlan0.ipaddress]: [172.26.210.24]
[dhcp.wlan0.mask]: [255.255.0.0]
[ro.build.display.id]: [G750-T01-CM11-NiuNai]
[ro.product.model]: [G750-T01]
[ro.product.locale.language]: [zh]
[ro.product.locale.region]: [CN]
[ro.serialno]: [DQBALFPNNBKRIVSO]
[gsm.serial]: [BY2PJU1496058698]
SystemProperties提供了get、set函数来访问和设置属性值,而具体的处理由C++实现(下面给出部分源码,一些重载的get、set函数省略。如果想具体了解函数实现的细节,可以参考http://www.cnblogs.com/bastard/archive/2012/10/11/2720314.html):
public classSystemProperties {//JNI调用函数
private static nativeString native_get(String key);private static native voidnative_set(String key, String def);public staticString get(String key) {if(TRACK_KEY_ACCESS) onKeyAccess(key);returnnative_get(key);
}public static voidset(String key, String val) {if (val != null && val.length() >PROP_VALUE_MAX) {thrownewValueTooLargeException(key, val);
}if(TRACK_KEY_ACCESS) onKeyAccess(key);
native_set(key, val);
}
}
这个类是隐藏的,上层程序开发无法直接使用。如果要用,需要用到java的反射机制,并且需要知道所需属性的具体标识key(建议使用下面的封装类),如:
Class clazz = Class.forName("android.os.SystemProperties");
Method MethodGet= clazz.getDeclaredMethod("get", String.class);
String serialno= (String) MethodGet.invoke(null,"ro.serialno");
Log.d("yi"," serialno: " +serialno);
日志:D/yi: serialno: DQBALFPNNBKRIVSO
2. android.os.Build (Information about the current build, extracted from system properties)
从备注可以看出,此类是基于系统信息的,提供了