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软件编程有所帮助。