Android判断用户2G/3G/4G移动数据网络
在做AndroidApp的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以在App的设置模块里,让用户自己选择,在2G/3G/4G网络条件下,是否允许请求一些流量比较大的数据。
通过Android提供的TelephonyManager和ConnectivityManager都可以获取到NetworksInfo对象,可以通过getType()获取类型,判断是wifi还是mobile,如果是mobile,可以通过NetworksInfo对象的getSubType()和getSubTypeName()可以获取到对于的网络类型和名字。
网络类型和名字定义在TelephonyManager类里。
/**Networktypeisunknown*/ publicstaticfinalintNETWORK_TYPE_UNKNOWN=0; /**CurrentnetworkisGPRS*/ publicstaticfinalintNETWORK_TYPE_GPRS=1; /**CurrentnetworkisEDGE*/ publicstaticfinalintNETWORK_TYPE_EDGE=2; /**CurrentnetworkisUMTS*/ publicstaticfinalintNETWORK_TYPE_UMTS=3; /**CurrentnetworkisCDMA:EitherIS95AorIS95B*/ publicstaticfinalintNETWORK_TYPE_CDMA=4; /**CurrentnetworkisEVDOrevision0*/ publicstaticfinalintNETWORK_TYPE_EVDO_0=5; /**CurrentnetworkisEVDOrevisionA*/ publicstaticfinalintNETWORK_TYPE_EVDO_A=6; /**Currentnetworkis1xRTT*/ publicstaticfinalintNETWORK_TYPE_1xRTT=7; /**CurrentnetworkisHSDPA*/ publicstaticfinalintNETWORK_TYPE_HSDPA=8; /**CurrentnetworkisHSUPA*/ publicstaticfinalintNETWORK_TYPE_HSUPA=9; /**CurrentnetworkisHSPA*/ publicstaticfinalintNETWORK_TYPE_HSPA=10; /**CurrentnetworkisiDen*/ publicstaticfinalintNETWORK_TYPE_IDEN=11; /**CurrentnetworkisEVDOrevisionB*/ publicstaticfinalintNETWORK_TYPE_EVDO_B=12; /**CurrentnetworkisLTE*/ publicstaticfinalintNETWORK_TYPE_LTE=13; /**CurrentnetworkiseHRPD*/ publicstaticfinalintNETWORK_TYPE_EHRPD=14; /**CurrentnetworkisHSPA+*/ publicstaticfinalintNETWORK_TYPE_HSPAP=15;
看到这个代码和注释,相信没有这方面知识的人很难看懂,都啥玩意?这注释跟没注释有啥区别?!就是让人看着更加闹心而已。所以说,注释对阅读代码的人很重要。当然这些东西可能太专业了,写这些代码的人估计是想写也不知道该怎么了,得写多大一坨啊?!我在最后会贴上一些我整理的资料,可以供大家参考一下,不是很详细,也不专业,就是大概有个印象。
TelephonyManager还提供了getNetworkTypeName(inttype)的方法,这个方法可以返回一个字符串,但是信息量不大。
那怎么判断是2G,3G还是4G网络呢?TelephonyManager还提供了另外一个方法,getNetworkClass(intnetworkType),但这个方法被隐藏掉了,我把代码贴一下。
publicstaticintgetNetworkClass(intnetworkType){ switch(networkType){ caseNETWORK_TYPE_GPRS: caseNETWORK_TYPE_EDGE: caseNETWORK_TYPE_CDMA: caseNETWORK_TYPE_1xRTT: caseNETWORK_TYPE_IDEN: returnNETWORK_CLASS_2_G; caseNETWORK_TYPE_UMTS: caseNETWORK_TYPE_EVDO_0: caseNETWORK_TYPE_EVDO_A: caseNETWORK_TYPE_HSDPA: caseNETWORK_TYPE_HSUPA: caseNETWORK_TYPE_HSPA: caseNETWORK_TYPE_EVDO_B: caseNETWORK_TYPE_EHRPD: caseNETWORK_TYPE_HSPAP: returnNETWORK_CLASS_3_G; caseNETWORK_TYPE_LTE: returnNETWORK_CLASS_4_G; default: returnNETWORK_CLASS_UNKNOWN; } }
然后下面是这几个常量的值。
/**Unknownnetworkclass.{@hide}*/ publicstaticfinalintNETWORK_CLASS_UNKNOWN=0; /**Classofbroadlydefined"2G"networks.{@hide}*/ publicstaticfinalintNETWORK_CLASS_2_G=1; /**Classofbroadlydefined"3G"networks.{@hide}*/ publicstaticfinalintNETWORK_CLASS_3_G=2; /**Classofbroadlydefined"4G"networks.{@hide}*/ publicstaticfinalintNETWORK_CLASS_4_G=3;
不知道为啥要把这些东西给隐藏起来,不靠谱?还是其他的更好的方式?!不知道,先这样吧,现在通过上面的手段,是可以知道用户用的是什么网络,当然也可以区分出来用户使用的是2G,3G还是4G了。当然,你获取到这些数据后,你也可以推算出用户用的是哪家公司的网络,移动的,联通的,还是电信的,当然,只在中国。而且虚拟运营商开始真正上市后,这个就区分不出来是京东的,还是国美,苏宁的了,但是你可以知道你的手机号用的是联通的网还是移动的网。
最后贴上我收集整理的一些资料,可以参考一下。
- GPRS 2G(2.5)GeneralPacketRadiaService114kbps
- EDGE 2G(2.75G)EnhancedDataRateforGSMEvolution384kbps
- UMTS 3GWCDMA联通3GUniversalMobileTelecommunicationSystem完整的3G移动通信技术标准
- CDMA 2G电信CodeDivisionMultipleAccess码分多址
- EVDO_0 3G(EVDO全程CDMA20001xEV-DO)Evolution-DataOnly(DataOptimized)153.6kps-2.4mbps属于3G
- EVDO_A 3G1.8mbps-3.1mbps属于3G过渡,3.5G
- 1xRTT 2GCDMA20001xRTT(RTT-无线电传输技术)144kbps2G的过渡,
- HSDPA 3.5G高速下行分组接入3.5GWCDMAHighSpeedDownlinkPacketAccess14.4mbps
- HSUPA 3.5GHighSpeedUplinkPacketAccess高速上行链路分组接入1.4-5.8mbps
- HSPA 3G(分HSDPA,HSUPA)HighSpeedPacketAccess
- IDEN 2GIntegratedDispatchEnhancedNetworks集成数字增强型网络(属于2G,来自维基百科)
- EVDO_B3GEV-DORev.B14.7Mbps下行3.5G
- LTE 4GLongTermEvolutionFDD-LTE和TDD-LTE,3G过渡,升级版LTEAdvanced才是4G
- EHRPD 3GCDMA2000向LTE4G的中间产物EvolvedHighRatePacketDataHRPD的升级
- HSPAP 3GHSPAP比HSDPA快些
实例:
importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.text.DecimalFormat; importjava.util.List; importandroid.content.Context; importandroid.net.ConnectivityManager; importandroid.net.NetworkInfo; importandroid.net.wifi.WifiInfo; importandroid.net.wifi.WifiManager; importandroid.telephony.NeighboringCellInfo; importandroid.telephony.TelephonyManager; importandroid.telephony.cdma.CdmaCellLocation; importandroid.telephony.gsm.GsmCellLocation; importandroid.util.Log; publicclassNetWorkUtil{ publicstaticbooleanisWifiAvailable(){ ConnectivityManagerconnectivityManager=(ConnectivityManager)ConfigManager .getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfonetworkInfo=connectivityManager.getActiveNetworkInfo(); return(networkInfo!=null&&networkInfo.isConnected()&&networkInfo .getType()==ConnectivityManager.TYPE_WIFI); } /** *获取MAC地址 * *@paramcontext *@return */ publicstaticStringgetMacAddress(Contextcontext){ if(context==null){ return""; } StringlocalMac=null; if(isWifiAvailable()){ localMac=getWifiMacAddress(context); } if(localMac!=null&&localMac.length()>0){ localMac=localMac.replace(":","-").toLowerCase(); returnlocalMac; } localMac=getMacFromCallCmd(); if(localMac!=null){ localMac=localMac.replace(":","-").toLowerCase(); } returnlocalMac; } privatestaticStringgetWifiMacAddress(Contextcontext){ StringlocalMac=null; try{ WifiManagerwifi=(WifiManager)context .getSystemService(Context.WIFI_SERVICE); WifiInfoinfo=wifi.getConnectionInfo(); if(wifi.isWifiEnabled()){ localMac=info.getMacAddress(); if(localMac!=null){ localMac=localMac.replace(":","-").toLowerCase(); returnlocalMac; } } }catch(Exceptione){ e.printStackTrace(); } returnnull; } /** *通过callCmd("busyboxifconfig","HWaddr")获取mac地址 * *@attention需要设备装有busybox工具 *@returnMacAddress */ privatestaticStringgetMacFromCallCmd(){ Stringresult=""; result=callCmd("busyboxifconfig","HWaddr"); if(result==null||result.length()<=0){ returnnull; } DebugLog.v("tag","cmdresult:"+result); //对该行数据进行解析 //例如:eth0Linkencap:EthernetHWaddr00:16:E8:3E:DF:67 if(result.length()>0&&result.contains("HWaddr")==true){ StringMac=result.substring(result.indexOf("HWaddr")+6, result.length()-1); if(Mac.length()>1){ result=Mac.replaceAll("",""); } } returnresult; } publicstaticStringcallCmd(Stringcmd,Stringfilter){ Stringresult=""; Stringline=""; try{ Processproc=Runtime.getRuntime().exec(cmd); InputStreamReaderis=newInputStreamReader(proc.getInputStream()); BufferedReaderbr=newBufferedReader(is); //执行命令cmd,只取结果中含有filter的这一行 while((line=br.readLine())!=null &&line.contains(filter)==false){ } result=line; }catch(Exceptione){ e.printStackTrace(); } returnresult; } /** *网络是否可用 * *@paramcontext *@return */ publicstaticbooleanIsNetWorkEnable(Contextcontext){ try{ ConnectivityManagerconnectivity=(ConnectivityManager)context .getSystemService(Context.CONNECTIVITY_SERVICE); if(connectivity==null){ ToastUtil.showMessage(context,"无法连接网络"); returnfalse; } NetworkInfoinfo=connectivity.getActiveNetworkInfo(); if(info!=null&&info.isConnected()){ //判断当前网络是否已经连接 if(info.getState()==NetworkInfo.State.CONNECTED){ returntrue; } } }catch(Exceptione){ e.printStackTrace(); } ToastUtil.showMessage(context,"无法连接网络"); returnfalse; } privatestaticfinalintNETWORK_TYPE_UNAVAILABLE=-1; //privatestaticfinalintNETWORK_TYPE_MOBILE=-100; privatestaticfinalintNETWORK_TYPE_WIFI=-101; privatestaticfinalintNETWORK_CLASS_WIFI=-101; privatestaticfinalintNETWORK_CLASS_UNAVAILABLE=-1; /**Unknownnetworkclass.*/ privatestaticfinalintNETWORK_CLASS_UNKNOWN=0; /**Classofbroadlydefined"2G"networks.*/ privatestaticfinalintNETWORK_CLASS_2_G=1; /**Classofbroadlydefined"3G"networks.*/ privatestaticfinalintNETWORK_CLASS_3_G=2; /**Classofbroadlydefined"4G"networks.*/ privatestaticfinalintNETWORK_CLASS_4_G=3; privatestaticDecimalFormatdf=newDecimalFormat("#.##"); //适配低版本手机 /**Networktypeisunknown*/ publicstaticfinalintNETWORK_TYPE_UNKNOWN=0; /**CurrentnetworkisGPRS*/ publicstaticfinalintNETWORK_TYPE_GPRS=1; /**CurrentnetworkisEDGE*/ publicstaticfinalintNETWORK_TYPE_EDGE=2; /**CurrentnetworkisUMTS*/ publicstaticfinalintNETWORK_TYPE_UMTS=3; /**CurrentnetworkisCDMA:EitherIS95AorIS95B*/ publicstaticfinalintNETWORK_TYPE_CDMA=4; /**CurrentnetworkisEVDOrevision0*/ publicstaticfinalintNETWORK_TYPE_EVDO_0=5; /**CurrentnetworkisEVDOrevisionA*/ publicstaticfinalintNETWORK_TYPE_EVDO_A=6; /**Currentnetworkis1xRTT*/ publicstaticfinalintNETWORK_TYPE_1xRTT=7; /**CurrentnetworkisHSDPA*/ publicstaticfinalintNETWORK_TYPE_HSDPA=8; /**CurrentnetworkisHSUPA*/ publicstaticfinalintNETWORK_TYPE_HSUPA=9; /**CurrentnetworkisHSPA*/ publicstaticfinalintNETWORK_TYPE_HSPA=10; /**CurrentnetworkisiDen*/ publicstaticfinalintNETWORK_TYPE_IDEN=11; /**CurrentnetworkisEVDOrevisionB*/ publicstaticfinalintNETWORK_TYPE_EVDO_B=12; /**CurrentnetworkisLTE*/ publicstaticfinalintNETWORK_TYPE_LTE=13; /**CurrentnetworkiseHRPD*/ publicstaticfinalintNETWORK_TYPE_EHRPD=14; /**CurrentnetworkisHSPA+*/ publicstaticfinalintNETWORK_TYPE_HSPAP=15; /** *格式化大小 * *@paramsize *@return */ publicstaticStringformatSize(longsize){ Stringunit="B"; floatlen=size; if(len>900){ len/=1024f; unit="KB"; } if(len>900){ len/=1024f; unit="MB"; } if(len>900){ len/=1024f; unit="GB"; } if(len>900){ len/=1024f; unit="TB"; } returndf.format(len)+unit; } publicstaticStringformatSizeBySecond(longsize){ Stringunit="B"; floatlen=size; if(len>900){ len/=1024f; unit="KB"; } if(len>900){ len/=1024f; unit="MB"; } if(len>900){ len/=1024f; unit="GB"; } if(len>900){ len/=1024f; unit="TB"; } returndf.format(len)+unit+"/s"; } publicstaticStringformat(longsize){ Stringunit="B"; floatlen=size; if(len>1000){ len/=1024f; unit="KB"; if(len>1000){ len/=1024f; unit="MB"; if(len>1000){ len/=1024f; unit="GB"; } } } returndf.format(len)+"\n"+unit+"/s"; } /** *获取运营商 * *@return */ publicstaticStringgetProvider(){ Stringprovider="未知"; try{ TelephonyManagertelephonyManager=(TelephonyManager)ConfigManager .getContext().getSystemService(Context.TELEPHONY_SERVICE); StringIMSI=telephonyManager.getSubscriberId(); Log.v("tag","getProvider.IMSI:"+IMSI); if(IMSI==null){ if(TelephonyManager.SIM_STATE_READY==telephonyManager .getSimState()){ Stringoperator=telephonyManager.getSimOperator(); Log.v("tag","getProvider.operator:"+operator); if(operator!=null){ if(operator.equals("46000") ||operator.equals("46002") ||operator.equals("46007")){ provider="中国移动"; }elseif(operator.equals("46001")){ provider="中国联通"; }elseif(operator.equals("46003")){ provider="中国电信"; } } } }else{ if(IMSI.startsWith("46000")||IMSI.startsWith("46002") ||IMSI.startsWith("46007")){ provider="中国移动"; }elseif(IMSI.startsWith("46001")){ provider="中国联通"; }elseif(IMSI.startsWith("46003")){ provider="中国电信"; } } }catch(Exceptione){ e.printStackTrace(); } returnprovider; } /** *获取网络类型 * *@return */ publicstaticStringgetCurrentNetworkType(){ intnetworkClass=getNetworkClass(); Stringtype="未知"; switch(networkClass){ caseNETWORK_CLASS_UNAVAILABLE: type="无"; break; caseNETWORK_CLASS_WIFI: type="Wi-Fi"; break; caseNETWORK_CLASS_2_G: type="2G"; break; caseNETWORK_CLASS_3_G: type="3G"; break; caseNETWORK_CLASS_4_G: type="4G"; break; caseNETWORK_CLASS_UNKNOWN: type="未知"; break; } returntype; } privatestaticintgetNetworkClassByType(intnetworkType){ switch(networkType){ caseNETWORK_TYPE_UNAVAILABLE: returnNETWORK_CLASS_UNAVAILABLE; caseNETWORK_TYPE_WIFI: returnNETWORK_CLASS_WIFI; caseNETWORK_TYPE_GPRS: caseNETWORK_TYPE_EDGE: caseNETWORK_TYPE_CDMA: caseNETWORK_TYPE_1xRTT: caseNETWORK_TYPE_IDEN: returnNETWORK_CLASS_2_G; caseNETWORK_TYPE_UMTS: caseNETWORK_TYPE_EVDO_0: caseNETWORK_TYPE_EVDO_A: caseNETWORK_TYPE_HSDPA: caseNETWORK_TYPE_HSUPA: caseNETWORK_TYPE_HSPA: caseNETWORK_TYPE_EVDO_B: caseNETWORK_TYPE_EHRPD: caseNETWORK_TYPE_HSPAP: returnNETWORK_CLASS_3_G; caseNETWORK_TYPE_LTE: returnNETWORK_CLASS_4_G; default: returnNETWORK_CLASS_UNKNOWN; } } privatestaticintgetNetworkClass(){ intnetworkType=NETWORK_TYPE_UNKNOWN; try{ finalNetworkInfonetwork=((ConnectivityManager)ConfigManager .getContext() .getSystemService(Context.CONNECTIVITY_SERVICE)) .getActiveNetworkInfo(); if(network!=null&&network.isAvailable() &&network.isConnected()){ inttype=network.getType(); if(type==ConnectivityManager.TYPE_WIFI){ networkType=NETWORK_TYPE_WIFI; }elseif(type==ConnectivityManager.TYPE_MOBILE){ TelephonyManagertelephonyManager=(TelephonyManager)ConfigManager .getContext().getSystemService( Context.TELEPHONY_SERVICE); networkType=telephonyManager.getNetworkType(); } }else{ networkType=NETWORK_TYPE_UNAVAILABLE; } }catch(Exceptionex){ ex.printStackTrace(); } returngetNetworkClassByType(networkType); } publicstaticStringgetWifiRssi(){ intasu=85; try{ finalNetworkInfonetwork=((ConnectivityManager)ConfigManager .getContext() .getSystemService(Context.CONNECTIVITY_SERVICE)) .getActiveNetworkInfo(); if(network!=null&&network.isAvailable() &&network.isConnected()){ inttype=network.getType(); if(type==ConnectivityManager.TYPE_WIFI){ WifiManagerwifiManager=(WifiManager)ConfigManager .getContext() .getSystemService(Context.WIFI_SERVICE); WifiInfowifiInfo=wifiManager.getConnectionInfo(); if(wifiInfo!=null){ asu=wifiInfo.getRssi(); } } } }catch(Exceptione){ e.printStackTrace(); } returnasu+"dBm"; } publicstaticStringgetWifiSsid(){ Stringssid=""; try{ finalNetworkInfonetwork=((ConnectivityManager)ConfigManager .getContext() .getSystemService(Context.CONNECTIVITY_SERVICE)) .getActiveNetworkInfo(); if(network!=null&&network.isAvailable() &&network.isConnected()){ inttype=network.getType(); if(type==ConnectivityManager.TYPE_WIFI){ WifiManagerwifiManager=(WifiManager)ConfigManager .getContext() .getSystemService(Context.WIFI_SERVICE); WifiInfowifiInfo=wifiManager.getConnectionInfo(); if(wifiInfo!=null){ ssid=wifiInfo.getSSID(); if(ssid==null){ ssid=""; } ssid=ssid.replaceAll("\"",""); } } } }catch(Exceptione){ e.printStackTrace(); } returnssid; } /** *检查sim卡状态 * *@paramctx *@return */ publicstaticbooleancheckSimState(){ TelephonyManagertm=(TelephonyManager)ConfigManager.getContext() .getSystemService(Context.TELEPHONY_SERVICE); if(tm.getSimState()==TelephonyManager.SIM_STATE_ABSENT ||tm.getSimState()==TelephonyManager.SIM_STATE_UNKNOWN){ returnfalse; } returntrue; } /** *获取imei */ publicstaticStringgetImei(){ TelephonyManagermTelephonyMgr=(TelephonyManager)ConfigManager .getContext().getSystemService(Context.TELEPHONY_SERVICE); Stringimei=mTelephonyMgr.getDeviceId(); if(imei==null){ imei="000000000000000"; } returnimei; } publicstaticStringgetPhoneImsi(){ TelephonyManagermTelephonyMgr=(TelephonyManager)ConfigManager .getContext().getSystemService(Context.TELEPHONY_SERVICE); returnmTelephonyMgr.getSubscriberId(); } publicstaticCellInfogetNetInfo(){ CellInfoinfo=newCellInfo(); try{ TelephonyManagermTelephonyManager=(TelephonyManager)ConfigManager .getContext().getSystemService(Context.TELEPHONY_SERVICE); Stringoperator=mTelephonyManager.getNetworkOperator(); if(operator!=null){ /**通过operator获取MCC和MNC*/ if(operator.length()>3){ Stringmcc=operator.substring(0,3); Stringmnc=operator.substring(3); info.setMcc(mcc); info.setMnc(mnc); } } intlac=0; intcellId=0; intphoneType=mTelephonyManager.getPhoneType(); if(phoneType==TelephonyManager.PHONE_TYPE_GSM){ GsmCellLocationlocation=(GsmCellLocation)mTelephonyManager .getCellLocation(); /**通过GsmCellLocation获取中国移动和联通LAC和cellID*/ lac=location.getLac(); cellId=location.getCid(); }elseif(phoneType==TelephonyManager.PHONE_TYPE_CDMA){ CdmaCellLocationlocation=(CdmaCellLocation)mTelephonyManager .getCellLocation(); lac=location.getNetworkId(); cellId=location.getBaseStationId(); cellId/=16; } if(lac==0||cellId==0){ List<NeighboringCellInfo>infos=mTelephonyManager .getNeighboringCellInfo(); intlc=0; intci=0; intrssi=0; for(NeighboringCellInfocell:infos){ //根据邻区总数进行循环 if(lc==0||ci==0){ lc=cell.getLac(); ci=cell.getCid(); rssi=cell.getRssi(); } //sb.append("LAC:"+info.getLac()); ////取出当前邻区的LAC //sb.append("CID:"+info.getCid()); ////取出当前邻区的CID //sb.append("BSSS:"+(-113+2*info.getRssi())+ //"\n");//获取邻区基站信号强度 } rssi=-113+2*rssi; } }catch(Exceptione){ e.printStackTrace(); } returninfo; } }
希望本文所述对大家学习Android软件编程有所帮助。