Android獲得設(shè)備狀態(tài)信息、Mac地址、IP地址的方法
前言
在APP開(kāi)發(fā)時(shí),經(jīng)常會(huì)遇到要獲取手機(jī)狀態(tài)信息的場(chǎng)景,像升級(jí)時(shí)獲取版本號(hào),像發(fā)生異常時(shí)要收集手機(jī)信息等等。有些軟件還要根據(jù)Mac地址來(lái)判定當(dāng)前用戶以前是否登錄過(guò)。下面將一一介紹獲取這些手機(jī)狀態(tài)信息的方法。
1 通過(guò)build獲取手機(jī)硬件信息
- 運(yùn)用反射獲取Build信息,然后從build中得到對(duì)應(yīng)字段的值。這種情況適用于獲取所有的build信息。
- 或者直接調(diào)用Build類直接拿里面的字段名,如:android.os.Build.MODEL; // 手機(jī)型號(hào) 。這是為了獲取單獨(dú)某個(gè)手機(jī)信息的方法,直接調(diào)用Build的字段即可拿到對(duì)應(yīng)信息,簡(jiǎn)單快捷。
- 別忘了加權(quán)限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
下面是Build類的字段所對(duì)應(yīng)的信息
String BOARD The name of the underlying board, like "goldfish".基板名 String BOOTLOADER The system bootloader version number. String BRAND The brand (e.g., carrier) the software is customized for, if any.品牌名 String CPU_ABI The name of the instruction set (CPU type + ABI convention) of native code. String CPU_ABI2 The name of the second instruction set (CPU type + ABI convention) of native code. String DEVICE The name of the industrial design.品牌型號(hào)名,如小米4對(duì)應(yīng)cancro String DISPLAY A build ID string meant for displaying to the user String FINGERPRINT A string that uniquely identifies this build.包含制造商,設(shè)備名,系統(tǒng)版本等諸多信息 String HARDWARE The name of the hardware (from the kernel command line or /proc). String HOST String ID Either a changelist number, or a label like "M4-rc20". String MANUFACTURER The manufacturer of the product/hardware. String MODEL The end-user-visible name for the end product. String PRODUCT The name of the overall product. String RADIO The radio firmware version number. String SERIAL A hardware serial number, if available. String TAGS Comma-separated tags describing the build, like "unsigned,debug". long TIME 當(dāng)前時(shí)間,毫秒值 String TYPE The type of build, like "user" or "eng". String UNKNOWN Value used for when a build property is unknown. String USER
//運(yùn)用反射得到build類里的字段
Field[] fields = Build.class.getDeclaredFields();
//遍歷字段名數(shù)組
for (Field field : fields) {
try {
//將字段都設(shè)為public可獲取
field.setAccessible(true);
//filed.get(null)得到的即是設(shè)備信息
haspmap.put(field.getName(), field.get(null).toString());
Log.d("CrashHandler", field.getName() + " : " + field.get(null));
} catch (Exception e) {
}
}
下面是小米4對(duì)應(yīng)的設(shè)備信息
D/CrashHandler: BOARD : MSM8974 D/CrashHandler: BOOTLOADER : unknown D/CrashHandler: BRAND : Xiaomi D/CrashHandler: CPU_ABI : armeabi-v7a D/CrashHandler: CPU_ABI2 : armeabi D/CrashHandler: DEVICE : cancro D/CrashHandler: DISPLAY : MMB29M D/CrashHandler: FINGERPRINT : Xiaomi/cancro_wc_lte/cancro:6.0.1/MMB29M/V8.1.3.0.MXDCNDI:user/release-keys D/CrashHandler: HARDWARE : qcom D/CrashHandler: HOST : c3-miui-ota-bd43 D/CrashHandler: ID : MMB29M D/CrashHandler: IS_DEBUGGABLE : false D/CrashHandler: MANUFACTURER : Xiaomi D/CrashHandler: MODEL : MI 4LTE D/CrashHandler: PRODUCT : cancro_wc_lte D/CrashHandler: RADIO : unknown //設(shè)備的序列號(hào)碼-SERIAL D/CrashHandler: SERIAL : abcdefgh D/CrashHandler: SUPPORTED_32_BIT_ABIS : [Ljava.lang.String;@76b6d2b D/CrashHandler: SUPPORTED_64_BIT_ABIS : [Ljava.lang.String;@e42c588 D/CrashHandler: SUPPORTED_ABIS : [Ljava.lang.String;@9cdbb21 D/CrashHandler: TAG : Build D/CrashHandler: TAGS : release-keys D/CrashHandler: TIME : 1478606340000 D/CrashHandler: TYPE : user D/CrashHandler: UNKNOWN : unknown D/CrashHandler: USER : builder
2.通過(guò)getSystemService()來(lái)獲取Ip地址
Context.getSystemService()這個(gè)方法是非常實(shí)用的方法,只須在參數(shù)里輸入一個(gè)String 字符串常量就可得到對(duì)應(yīng)的服務(wù)管理方法,可以用來(lái)獲取絕大部分的系統(tǒng)信息,各個(gè)常量對(duì)應(yīng)的含義如下。
WINDOW_SERVICE (“window”)
The top-level window manager in which you can place custom windows. The returned object is a WindowManager.
LAYOUT_INFLATER_SERVICE (“l(fā)ayout_inflater”)
A LayoutInflater for inflating layout resources in this context.
ACTIVITY_SERVICE (“activity”)
A ActivityManager for interacting with the global activity state of the system.
POWER_SERVICE (“power”)
A PowerManager for controlling power management.
ALARM_SERVICE (“alarm”)
A AlarmManager for receiving intents at the time of your choosing.
NOTIFICATION_SERVICE (“notification”)
A NotificationManager for informing the user of background events.
KEYGUARD_SERVICE (“keyguard”)
A KeyguardManager for controlling keyguard.
LOCATION_SERVICE (“l(fā)ocation”)
A LocationManager for controlling location (e.g., GPS) updates.
SEARCH_SERVICE (“search”)
A SearchManager for handling search.
VIBRATOR_SERVICE (“vibrator”)
A Vibrator for interacting with the vibrator hardware.
CONNECTIVITY_SERVICE (“connection”)
A ConnectivityManager for handling management of network connections.
WIFI_SERVICE (“wifi”)
A WifiManager for management of Wi-Fi connectivity.
WIFI_P2P_SERVICE (“wifip2p”)
A WifiP2pManager for management of Wi-Fi Direct connectivity.
INPUT_METHOD_SERVICE (“input_method”)
An InputMethodManager for management of input methods.
UI_MODE_SERVICE (“uimode”)
An UiModeManager for controlling UI modes.
DOWNLOAD_SERVICE (“download”)
A DownloadManager for requesting HTTP downloads
BATTERY_SERVICE (“batterymanager”)
A BatteryManager for managing battery state
JOB_SCHEDULER_SERVICE (“taskmanager”)
A JobScheduler for managing scheduled tasks
NETWORK_STATS_SERVICE (“netstats”)
A NetworkStatsManager for querying network usage statistics.
Note: System services obtained via this API may be closely associated with the Context in which they are obtained from. In general, do not share the service objects between various different contexts (Activities, Applications, Services, Providers, etc.)
Parameters
name
The name of the desired service.
Returns
The service or null if the name does not exist.
要獲取IP地址需要用到Context.CONNECTIVITY_SERVICE,這個(gè)常量所對(duì)應(yīng)的網(wǎng)絡(luò)連接的管理方法。
代碼如下需要權(quán)限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
/**獲得IP地址,分為兩種情況,一是wifi下,二是移動(dòng)網(wǎng)絡(luò)下,得到的ip地址是不一樣的*/
public static String getIPAddress() {
Context context=MyApp.getContext();
NetworkInfo info = ((ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//當(dāng)前使用2G/3G/4G網(wǎng)絡(luò)
try {
//Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
} else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//當(dāng)前使用無(wú)線網(wǎng)絡(luò)
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//調(diào)用方法將int轉(zhuǎn)換為地址字符串
String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
return ipAddress;
}
} else {
//當(dāng)前無(wú)網(wǎng)絡(luò)連接,請(qǐng)?jiān)谠O(shè)置中打開(kāi)網(wǎng)絡(luò)
}
return null;
}
/**
* 將得到的int類型的IP轉(zhuǎn)換為String類型
* @param ip
* @return
*/
public static String intIP2StringIP(int ip) {
return (ip & 0xFF) + "." +
((ip >> 8) & 0xFF) + "." +
((ip >> 16) & 0xFF) + "." +
(ip >> 24 & 0xFF);
}
3.獲得Mac地址
我們知道m(xù)ac地址是網(wǎng)卡的唯一標(biāo)識(shí),通過(guò)這個(gè)可以判斷網(wǎng)絡(luò)當(dāng)前連接的手機(jī)設(shè)備有幾臺(tái)。代碼如下:
public static String getMacAddress(){
/*獲取mac地址有一點(diǎn)需要注意的就是android 6.0版本后,以下注釋方法不再適用,不管任何手機(jī)都會(huì)返回"02:00:00:00:00:00"這個(gè)默認(rèn)的mac地址,這是googel官方為了加強(qiáng)權(quán)限管理而禁用了getSYstemService(Context.WIFI_SERVICE)方法來(lái)獲得mac地址。*/
// String macAddress= "";
// WifiManager wifiManager = (WifiManager) MyApp.getContext().getSystemService(Context.WIFI_SERVICE);
// WifiInfo wifiInfo = wifiManager.getConnectionInfo();
// macAddress = wifiInfo.getMacAddress();
// return macAddress;
String macAddress = null;
StringBuffer buf = new StringBuffer();
NetworkInterface networkInterface = null;
try {
networkInterface = NetworkInterface.getByName("eth1");
if (networkInterface == null) {
networkInterface = NetworkInterface.getByName("wlan0");
}
if (networkInterface == null) {
return "02:00:00:00:00:02";
}
byte[] addr = networkInterface.getHardwareAddress();
for (byte b : addr) {
buf.append(String.format("%02X:", b));
}
if (buf.length() > 0) {
buf.deleteCharAt(buf.length() - 1);
}
macAddress = buf.toString();
} catch (SocketException e) {
e.printStackTrace();
return "02:00:00:00:00:02";
}
return macAddress;
}
4.獲取手機(jī)號(hào)碼、IMEI碼
/**獲取手機(jī)的IMEI號(hào)碼*/
public static String getPhoneIMEI() {
TelephonyManager mTm = (TelephonyManager) MyApp.getContext().getSystemService(Context.TELEPHONY_SERVICE);
String imei = mTm.getDeviceId();
String imsi = mTm.getSubscriberId();
String mtype = android.os.Build.MODEL; // 手機(jī)型號(hào)
String numer = mTm.getLine1Number(); // 手機(jī)號(hào)碼,有的可得,有的不可得
return imei;
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- Android開(kāi)發(fā)獲取手機(jī)內(nèi)網(wǎng)IP地址與外網(wǎng)IP地址的詳細(xì)方法與源碼實(shí)例
- Android中使用adb命令通過(guò)IP地址連接手機(jī)
- Android實(shí)現(xiàn)IP地址輸入框的方法示例代碼
- Android開(kāi)發(fā)實(shí)現(xiàn)在Wifi下獲取本地IP地址的方法
- Android 判斷ip地址合法實(shí)現(xiàn)代碼
- Android 獲取IP地址的實(shí)現(xiàn)方法
- android 獲取本機(jī)的IP地址和mac物理地址的實(shí)現(xiàn)方法
- android實(shí)現(xiàn)獲取有線和無(wú)線Ip地址的方法
- Android手機(jī)獲取IP地址的兩種方法
- Android開(kāi)發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式
相關(guān)文章
android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
Android錄音功能的實(shí)現(xiàn)以及踩坑實(shí)戰(zhàn)記錄
在Android 開(kāi)發(fā)過(guò)程中,有些功能是通用的,或者是多個(gè)業(yè)務(wù)方都需要使用的,下面這篇文章主要給大家介紹了關(guān)于Android錄音功能的實(shí)現(xiàn)以及踩坑的相關(guān)資料,需要的朋友可以參考下2022-06-06
Android編程實(shí)現(xiàn)仿易信精美彈出框效果【附demo源碼下載】
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿易信精美彈出框效果,涉及Android窗口及動(dòng)畫操作相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-01-01
Android計(jì)時(shí)與倒計(jì)時(shí)實(shí)現(xiàn)限時(shí)搶購(gòu)的5種方法
這篇文章主要為大家詳細(xì)介紹了Android計(jì)時(shí)與倒計(jì)時(shí)實(shí)現(xiàn)限時(shí)搶購(gòu)的5種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Android中ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn)
本篇文章主要介紹了Android中ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn),具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11
Android懸浮窗的實(shí)現(xiàn)(易錯(cuò)點(diǎn))
現(xiàn)在很多應(yīng)用都使用到懸浮窗,例如微信在視頻的時(shí)候,點(diǎn)擊Home鍵,視頻小窗口仍然會(huì)在屏幕上顯示。下面小編來(lái)實(shí)現(xiàn)一下android 懸浮窗,感興趣的朋友跟隨小編一起看看吧2019-10-10
android仿愛(ài)奇藝加載動(dòng)畫實(shí)例
這篇文章主要介紹了android仿愛(ài)奇藝加載動(dòng)畫實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。2016-10-10
Android 中 Fragment 嵌套 Fragment使用存在的bug附完美解決方案
本文從兩個(gè)方面淺析Android 中 Fragment 嵌套 Fragment使用存在的bug問(wèn)題,原因找到就可以完美的解決了,對(duì)fragment嵌套fragment使用相關(guān)知識(shí)感興趣的朋友一起看看吧2016-08-08

