很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑。但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下。
一加手机一代,移动4G网络,得到的subtype类型值为17,我查过Android5.1的源码,它最大的值也就为16。(点击这里在线查看源码>>)
我拿魅族的移动4G测试的结果如下:
小米4,电信4G的测试结果如下:
魅族MX4,联通3G
还测试了其它华为移动3G/4G的情况,就我自己的手机一加返回的值有点奇怪,之后我查了一下它的参数:http://detail.zol.com.cn/374/373908/param.shtml
当然,其它厂商:华为、小米、魅族与上面显示的网络类型基本上是一致的。都是3G:TD-SCDMA、WCDMA等
而目前测试的情况就是仅一加返回的值为17,这会导致正常的判断出现问题,无法识别到底使用的是何种网络。而我通过logcat的日志,却很清晰的发现系统自己是能识别的
最后我根据网络上提供的资料,加了一项比较特殊的判断,演变成如下的代码:
publicstaticStringGetNetworkType()
{
StringstrNetworkType="";
NetworkInfonetworkInfo=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE).getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected())
{
if(networkInfo.getType()==ConnectivityManager.TYPE_WIFI)
{
strNetworkType="WIFI";
}
elseif(networkInfo.getType()==ConnectivityManager.TYPE_MOBILE)
{
String_strSubTypeName=networkInfo.getSubtypeName();
Log.e("cocos2d-x","NetworkgetSubtypeName:"+_strSubTypeName);
//TD-SCDMAnetworkTypeis17
intnetworkType=networkInfo.getSubtype();
switch(networkType){
caseTelephonyManager.NETWORK_TYPE_GPRS:
caseTelephonyManager.NETWORK_TYPE_EDGE:
caseTelephonyManager.NETWORK_TYPE_CDMA:
caseTelephonyManager.NETWORK_TYPE_1xRTT:
caseTelephonyManager.NETWORK_TYPE_IDEN://api<8:replaceby11
strNetworkType="2G";
break;
caseTelephonyManager.NETWORK_TYPE_UMTS:
caseTelephonyManager.NETWORK_TYPE_EVDO_0:
caseTelephonyManager.NETWORK_TYPE_EVDO_A:
caseTelephonyManager.NETWORK_TYPE_HSDPA:
caseTelephonyManager.NETWORK_TYPE_HSUPA:
caseTelephonyManager.NETWORK_TYPE_HSPA:
caseTelephonyManager.NETWORK_TYPE_EVDO_B://api<9:replaceby14
caseTelephonyManager.NETWORK_TYPE_EHRPD://api<11:replaceby12
caseTelephonyManager.NETWORK_TYPE_HSPAP://api<13:replaceby15
strNetworkType="3G";
break;
caseTelephonyManager.NETWORK_TYPE_LTE://api<11:replaceby13
strNetworkType="4G";
break;
default:
//http://baike.baidu.com/item/TD-SCDMA中国移动联通电信三种3G制式
if(_strSubTypeName.equalsIgnoreCase("TD-SCDMA")||_strSubTypeName.equalsIgnoreCase("WCDMA")||_strSubTypeName.equalsIgnoreCase("CDMA2000"))
{
strNetworkType="3G";
}
else
{
strNetworkType=_strSubTypeName;
}
break;
}
Log.e("cocos2d-x","NetworkgetSubtype:"+Integer.valueOf(networkType).toString());
}
}
Log.e("cocos2d-x","NetworkType:"+strNetworkType);
returnstrNetworkType;
}
希望对需要的人有所帮助吧。我在网上搜索到,之前其实有人提出过类似的疑问,但是没有答案:
telephony.getNetworkType()这个方法为什么在有些手机里面获取的值API没有呢,例如16、17。这两个在TelephonyManager这个API里面就没有
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56664.shtml