Android获得设备状态信息、Mac地址、IP地址的方法
前言
在APP开发时,经常会遇到要获取手机状态信息的场景,像升级时获取版本号,像发生异常时要收集手机信息等等。有些软件还要根据Mac地址来判定当前用户以前是否登录过。下面将一一介绍获取这些手机状态信息的方法。
1通过build获取手机硬件信息
- 运用反射获取Build信息,然后从build中得到对应字段的值。这种情况适用于获取所有的build信息。
- 或者直接调用Build类直接拿里面的字段名,如:android.os.Build.MODEL;//手机型号。这是为了获取单独某个手机信息的方法,直接调用Build的字段即可拿到对应信息,简单快捷。
- 别忘了加权限
下面是Build类的字段所对应的信息
StringBOARDThenameoftheunderlyingboard,like"goldfish".基板名 StringBOOTLOADERThesystembootloaderversionnumber. StringBRANDThebrand(e.g.,carrier)thesoftwareiscustomizedfor,ifany.品牌名 StringCPU_ABIThenameoftheinstructionset(CPUtype+ABIconvention)ofnativecode. StringCPU_ABI2Thenameofthesecondinstructionset(CPUtype+ABIconvention)ofnativecode. StringDEVICEThenameoftheindustrialdesign.品牌型号名,如小米4对应cancro StringDISPLAYAbuildIDstringmeantfordisplayingtotheuser StringFINGERPRINTAstringthatuniquelyidentifiesthisbuild.包含制造商,设备名,系统版本等诸多信息 StringHARDWAREThenameofthehardware(fromthekernelcommandlineor/proc). StringHOST StringIDEitherachangelistnumber,oralabellike"M4-rc20". StringMANUFACTURERThemanufactureroftheproduct/hardware. StringMODELTheend-user-visiblenamefortheendproduct. StringPRODUCTThenameoftheoverallproduct. StringRADIOTheradiofirmwareversionnumber. StringSERIALAhardwareserialnumber,ifavailable. StringTAGSComma-separatedtagsdescribingthebuild,like"unsigned,debug". longTIME当前时间,毫秒值 StringTYPEThetypeofbuild,like"user"or"eng". StringUNKNOWNValueusedforwhenabuildpropertyisunknown. StringUSER
//运用反射得到build类里的字段
Field[]fields=Build.class.getDeclaredFields();
//遍历字段名数组
for(Fieldfield:fields){
try{
//将字段都设为public可获取
field.setAccessible(true);
//filed.get(null)得到的即是设备信息
haspmap.put(field.getName(),field.get(null).toString());
Log.d("CrashHandler",field.getName()+":"+field.get(null));
}catch(Exceptione){
}
}
下面是小米4对应的设备信息
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:MI4LTE D/CrashHandler:PRODUCT:cancro_wc_lte D/CrashHandler:RADIO:unknown //设备的序列号码-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.通过getSystemService()来获取Ip地址
Context.getSystemService()这个方法是非常实用的方法,只须在参数里输入一个String字符串常量就可得到对应的服务管理方法,可以用来获取绝大部分的系统信息,各个常量对应的含义如下。
WINDOW_SERVICE(“window”)
Thetop-levelwindowmanagerinwhichyoucanplacecustomwindows.ThereturnedobjectisaWindowManager.
LAYOUT_INFLATER_SERVICE(“layout_inflater”)
ALayoutInflaterforinflatinglayoutresourcesinthiscontext.
ACTIVITY_SERVICE(“activity”)
AActivityManagerforinteractingwiththeglobalactivitystateofthesystem.
POWER_SERVICE(“power”)
APowerManagerforcontrollingpowermanagement.
ALARM_SERVICE(“alarm”)
AAlarmManagerforreceivingintentsatthetimeofyourchoosing.
NOTIFICATION_SERVICE(“notification”)
ANotificationManagerforinformingtheuserofbackgroundevents.
KEYGUARD_SERVICE(“keyguard”)
AKeyguardManagerforcontrollingkeyguard.
LOCATION_SERVICE(“location”)
ALocationManagerforcontrollinglocation(e.g.,GPS)updates.
SEARCH_SERVICE(“search”)
ASearchManagerforhandlingsearch.
VIBRATOR_SERVICE(“vibrator”)
AVibratorforinteractingwiththevibratorhardware.
CONNECTIVITY_SERVICE(“connection”)
AConnectivityManagerforhandlingmanagementofnetworkconnections.
WIFI_SERVICE(“wifi”)
AWifiManagerformanagementofWi-Ficonnectivity.
WIFI_P2P_SERVICE(“wifip2p”)
AWifiP2pManagerformanagementofWi-FiDirectconnectivity.
INPUT_METHOD_SERVICE(“input_method”)
AnInputMethodManagerformanagementofinputmethods.
UI_MODE_SERVICE(“uimode”)
AnUiModeManagerforcontrollingUImodes.
DOWNLOAD_SERVICE(“download”)
ADownloadManagerforrequestingHTTPdownloads
BATTERY_SERVICE(“batterymanager”)
ABatteryManagerformanagingbatterystate
JOB_SCHEDULER_SERVICE(“taskmanager”)
AJobSchedulerformanagingscheduledtasks
NETWORK_STATS_SERVICE(“netstats”)
ANetworkStatsManagerforqueryingnetworkusagestatistics.
Note:SystemservicesobtainedviathisAPImaybecloselyassociatedwiththeContextinwhichtheyareobtainedfrom.Ingeneral,donotsharetheserviceobjectsbetweenvariousdifferentcontexts(Activities,Applications,Services,Providers,etc.)
Parameters
name
Thenameofthedesiredservice.
Returns
Theserviceornullifthenamedoesnotexist.
要获取IP地址需要用到Context.CONNECTIVITY_SERVICE,这个常量所对应的网络连接的管理方法。
代码如下需要权限:
/**获得IP地址,分为两种情况,一是wifi下,二是移动网络下,得到的ip地址是不一样的*/
publicstaticStringgetIPAddress(){
Contextcontext=MyApp.getContext();
NetworkInfoinfo=((ConnectivityManager)context
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if(info!=null&&info.isConnected()){
if(info.getType()==ConnectivityManager.TYPE_MOBILE){//当前使用2G/3G/4G网络
try{
//Enumerationen=NetworkInterface.getNetworkInterfaces();
for(Enumerationen=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterfaceintf=en.nextElement();
for(EnumerationenumIpAddr=intf.getInetAddresses();enumIpAddr.hasMoreElements();){
InetAddressinetAddress=enumIpAddr.nextElement();
if(!inetAddress.isLoopbackAddress()&&inetAddressinstanceofInet4Address){
returninetAddress.getHostAddress();
}
}
}
}catch(SocketExceptione){
e.printStackTrace();
}
}elseif(info.getType()==ConnectivityManager.TYPE_WIFI){//当前使用无线网络
WifiManagerwifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfowifiInfo=wifiManager.getConnectionInfo();
//调用方法将int转换为地址字符串
StringipAddress=intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
returnipAddress;
}
}else{
//当前无网络连接,请在设置中打开网络
}
returnnull;
}
/**
*将得到的int类型的IP转换为String类型
*@paramip
*@return
*/
publicstaticStringintIP2StringIP(intip){
return(ip&0xFF)+"."+
((ip>>8)&0xFF)+"."+
((ip>>16)&0xFF)+"."+
(ip>>24&0xFF);
}
3.获得Mac地址
我们知道mac地址是网卡的唯一标识,通过这个可以判断网络当前连接的手机设备有几台。代码如下:
publicstaticStringgetMacAddress(){
/*获取mac地址有一点需要注意的就是android6.0版本后,以下注释方法不再适用,不管任何手机都会返回"02:00:00:00:00:00"这个默认的mac地址,这是googel官方为了加强权限管理而禁用了getSYstemService(Context.WIFI_SERVICE)方法来获得mac地址。*/
//StringmacAddress="";
//WifiManagerwifiManager=(WifiManager)MyApp.getContext().getSystemService(Context.WIFI_SERVICE);
//WifiInfowifiInfo=wifiManager.getConnectionInfo();
//macAddress=wifiInfo.getMacAddress();
//returnmacAddress;
StringmacAddress=null;
StringBufferbuf=newStringBuffer();
NetworkInterfacenetworkInterface=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(byteb:addr){
buf.append(String.format("%02X:",b));
}
if(buf.length()>0){
buf.deleteCharAt(buf.length()-1);
}
macAddress=buf.toString();
}catch(SocketExceptione){
e.printStackTrace();
return"02:00:00:00:00:02";
}
returnmacAddress;
}
4.获取手机号码、IMEI码
/**获取手机的IMEI号码*/
publicstaticStringgetPhoneIMEI(){
TelephonyManagermTm=(TelephonyManager)MyApp.getContext().getSystemService(Context.TELEPHONY_SERVICE);
Stringimei=mTm.getDeviceId();
Stringimsi=mTm.getSubscriberId();
Stringmtype=android.os.Build.MODEL;//手机型号
Stringnumer=mTm.getLine1Number();//手机号码,有的可得,有的不可得
returnimei;
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接