android如何判断当前网络类型(联网,2g,3g,wifi等)
2017-03-07 10:30
639 查看
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!
一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在3g网络下,百度地图的定位功能存在很大的偏差,这就需要提前判断网络类型针对3g网络情况做特殊的处理。
关于Android如何检测网络的类型,网上代码很多,但是有用的不多,真正解决了问题的我只找到一篇(见文章末尾网址),为了更好的方便自己理解,对这片文章做了解释和整理。
在android中判断网络需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager判断当前是否联网:
public
static
boolean isNetworkConnected()
{
ConnectivityManager
cm =
(ConnectivityManager)
AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo
ni = cm.getActiveNetworkInfo();
return
ni !=
null
&& ni.isConnectedOrConnecting();
}
其中有个疑问,
,所以我觉得还是改成isConnected()好些,根据个人的需求吧。
上面只是判断是否联网,跟我们的目的还有很大的差距,为了获得具体的网络类型需要对
ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_WIMAX,
ConnectivityManager.TYPE_ETHERNET,
ConnectivityManager.TYPE_BLUETOOTH
五种,其中只有ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_WIFI是跟互联网有关的,可见ConnectivityManager并不是专门管理互联网连接的,还负责蓝牙等连接。
先定义一些整形变量代表不同的网络:
/** 没有网络 */
public
static
final
int NETWORKTYPE_INVALID
=
0;
/** wap网络 */
public
static
final
int NETWORKTYPE_WAP
=
1;
/** 2G网络 */
public
static
final
int NETWORKTYPE_2G
=
2;
/** 3G和3G以上网络,或统称为快速网络 */
public
static
final
int NETWORKTYPE_3G
=
3;
/** wifi网络 */
public
static
final
int NETWORKTYPE_WIFI
=
4;
这些常量将在后面用到。
下面我们通过一个方法来实现判断是wifi还是移动网络,如果是移动网络再通过其他方法进一步分析是3g还是2g:
/**
* 获取网络状态,wifi,wap,2g,3g.
*
* @param context 上下文
* @return int 网络状态 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}, *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@link #NETWORKTYPE_WIFI}
*/
public
static
int getNetWorkType(Context
context)
{
ConnectivityManager manager
=
(ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo
= manager.getActiveNetworkInfo();
if
(networkInfo
!=
null
&& networkInfo.isConnected())
{
String type
= networkInfo.getTypeName();
if
(type.equalsIgnoreCase("WIFI"))
{
mNetWorkType
= NETWORKTYPE_WIFI;
}
else
if
(type.equalsIgnoreCase("MOBILE"))
{
String proxyHost
= android.net.Proxy.getDefaultHost();
mNetWorkType
=
TextUtils.isEmpty(proxyHost)
?
(isFastMobileNetwork(context)
? NETWORKTYPE_3G
: NETWORKTYPE_2G)
: NETWORKTYPE_WAP;
}
}
else
{
mNetWorkType
= NETWORKTYPE_INVALID;
}
return mNetWorkType;
}
其中为了区别是3g还是2g我们定义了
private
static
boolean isFastMobileNetwork(Context
context)
{
TelephonyManager telephonyManager
=
(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
switch
(telephonyManager.getNetworkType())
{
case
TelephonyManager.NETWORK_TYPE_1xRTT:
return
false;
// ~ 50-100 kbps
case
TelephonyManager.NETWORK_TYPE_CDMA:
return
false;
// ~ 14-64 kbps
case
TelephonyManager.NETWORK_TYPE_EDGE:
return
false;
// ~ 50-100 kbps
case
TelephonyManager.NETWORK_TYPE_EVDO_0:
return
true;
// ~ 400-1000 kbps
case
TelephonyManager.NETWORK_TYPE_EVDO_A:
return
true;
// ~ 600-1400 kbps
case
TelephonyManager.NETWORK_TYPE_GPRS:
return
false;
// ~ 100 kbps
case
TelephonyManager.NETWORK_TYPE_HSDPA:
return
true;
// ~ 2-14 Mbps
case
TelephonyManager.NETWORK_TYPE_HSPA:
return
true;
// ~ 700-1700 kbps
case
TelephonyManager.NETWORK_TYPE_HSUPA:
return
true;
// ~ 1-23 Mbps
case
TelephonyManager.NETWORK_TYPE_UMTS:
return
true;
// ~ 400-7000 kbps
case
TelephonyManager.NETWORK_TYPE_EHRPD:
return
true;
// ~ 1-2 Mbps
case
TelephonyManager.NETWORK_TYPE_EVDO_B:
return
true;
// ~ 5 Mbps
case
TelephonyManager.NETWORK_TYPE_HSPAP:
return
true;
// ~ 10-20 Mbps
case
TelephonyManager.NETWORK_TYPE_IDEN:
return
false;
// ~25 kbps
case
TelephonyManager.NETWORK_TYPE_LTE:
return
true;
// ~ 10+ Mbps
case
TelephonyManager.NETWORK_TYPE_UNKNOWN:
return
false;
default:
return
false;
}
}
整个过程可总结为:第一步通过ConnectivityManager判断是wifi还是mobile网络,在通过TelephonyManager判断移动网络的类型。
参考:http://blog.csdn.net/nanzhiwen666/article/details/8288433#
一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在3g网络下,百度地图的定位功能存在很大的偏差,这就需要提前判断网络类型针对3g网络情况做特殊的处理。
关于Android如何检测网络的类型,网上代码很多,但是有用的不多,真正解决了问题的我只找到一篇(见文章末尾网址),为了更好的方便自己理解,对这片文章做了解释和整理。
在android中判断网络需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager判断当前是否联网:
public
static
boolean isNetworkConnected()
{
ConnectivityManager
cm =
(ConnectivityManager)
AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo
ni = cm.getActiveNetworkInfo();
return
ni !=
null
&& ni.isConnectedOrConnecting();
}
其中有个疑问,
isConnectedOrConnecting()从字面上看是是否连接或者正在连接,如果正在连接的是一个不可用的网络,那应该算不联网的吧
,所以我觉得还是改成isConnected()好些,根据个人的需求吧。
上面只是判断是否联网,跟我们的目的还有很大的差距,为了获得具体的网络类型需要对
NetworkInfo中的信息进一步分解,
NetworkInfo的getTypeName()方法可以判断出是wifi还是mobile网络,与getTypeName()方法对应的是getType方法,返回的是代表连接类型的整形常量,api中标明的有
ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_WIMAX,
ConnectivityManager.TYPE_ETHERNET,
ConnectivityManager.TYPE_BLUETOOTH
五种,其中只有ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_WIFI是跟互联网有关的,可见ConnectivityManager并不是专门管理互联网连接的,还负责蓝牙等连接。
先定义一些整形变量代表不同的网络:
/** 没有网络 */
public
static
final
int NETWORKTYPE_INVALID
=
0;
/** wap网络 */
public
static
final
int NETWORKTYPE_WAP
=
1;
/** 2G网络 */
public
static
final
int NETWORKTYPE_2G
=
2;
/** 3G和3G以上网络,或统称为快速网络 */
public
static
final
int NETWORKTYPE_3G
=
3;
/** wifi网络 */
public
static
final
int NETWORKTYPE_WIFI
=
4;
这些常量将在后面用到。
下面我们通过一个方法来实现判断是wifi还是移动网络,如果是移动网络再通过其他方法进一步分析是3g还是2g:
/**
* 获取网络状态,wifi,wap,2g,3g.
*
* @param context 上下文
* @return int 网络状态 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}, *{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@link #NETWORKTYPE_WIFI}
*/
public
static
int getNetWorkType(Context
context)
{
ConnectivityManager manager
=
(ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo
= manager.getActiveNetworkInfo();
if
(networkInfo
!=
null
&& networkInfo.isConnected())
{
String type
= networkInfo.getTypeName();
if
(type.equalsIgnoreCase("WIFI"))
{
mNetWorkType
= NETWORKTYPE_WIFI;
}
else
if
(type.equalsIgnoreCase("MOBILE"))
{
String proxyHost
= android.net.Proxy.getDefaultHost();
mNetWorkType
=
TextUtils.isEmpty(proxyHost)
?
(isFastMobileNetwork(context)
? NETWORKTYPE_3G
: NETWORKTYPE_2G)
: NETWORKTYPE_WAP;
}
}
else
{
mNetWorkType
= NETWORKTYPE_INVALID;
}
return mNetWorkType;
}
其中为了区别是3g还是2g我们定义了
isFastMobileNetwork(context)方法,主要用到了
TelephonyManager:
private
static
boolean isFastMobileNetwork(Context
context)
{
TelephonyManager telephonyManager
=
(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
switch
(telephonyManager.getNetworkType())
{
case
TelephonyManager.NETWORK_TYPE_1xRTT:
return
false;
// ~ 50-100 kbps
case
TelephonyManager.NETWORK_TYPE_CDMA:
return
false;
// ~ 14-64 kbps
case
TelephonyManager.NETWORK_TYPE_EDGE:
return
false;
// ~ 50-100 kbps
case
TelephonyManager.NETWORK_TYPE_EVDO_0:
return
true;
// ~ 400-1000 kbps
case
TelephonyManager.NETWORK_TYPE_EVDO_A:
return
true;
// ~ 600-1400 kbps
case
TelephonyManager.NETWORK_TYPE_GPRS:
return
false;
// ~ 100 kbps
case
TelephonyManager.NETWORK_TYPE_HSDPA:
return
true;
// ~ 2-14 Mbps
case
TelephonyManager.NETWORK_TYPE_HSPA:
return
true;
// ~ 700-1700 kbps
case
TelephonyManager.NETWORK_TYPE_HSUPA:
return
true;
// ~ 1-23 Mbps
case
TelephonyManager.NETWORK_TYPE_UMTS:
return
true;
// ~ 400-7000 kbps
case
TelephonyManager.NETWORK_TYPE_EHRPD:
return
true;
// ~ 1-2 Mbps
case
TelephonyManager.NETWORK_TYPE_EVDO_B:
return
true;
// ~ 5 Mbps
case
TelephonyManager.NETWORK_TYPE_HSPAP:
return
true;
// ~ 10-20 Mbps
case
TelephonyManager.NETWORK_TYPE_IDEN:
return
false;
// ~25 kbps
case
TelephonyManager.NETWORK_TYPE_LTE:
return
true;
// ~ 10+ Mbps
case
TelephonyManager.NETWORK_TYPE_UNKNOWN:
return
false;
default:
return
false;
}
}
整个过程可总结为:第一步通过ConnectivityManager判断是wifi还是mobile网络,在通过TelephonyManager判断移动网络的类型。
参考:http://blog.csdn.net/nanzhiwen666/article/details/8288433#
相关文章推荐
- android如何判断当前网络类型(联网,2g,3g,wifi等)
- android 判断当前联网类型是2g,3g,4g,wifi还是其他
- Android判断当前网络类型2G/3G/4G/WIFI
- Android如何检测网络的类型为3G、2G、wap、wifi .
- Android端如何获取手机当前的网络状态,比如wifi还是3G, 还是2G, 电信还是联通,还是移动
- Android端如何获取手机当前的网络状态,比如wifi还是3G, 还是2G, 电信还是联通,还是移动
- Android网络类型判断(2g、3g、wifi)
- Android网络类型判断(2g、3g、wifi)
- Android如何检测网络的类型为3G、2G、wap、wifi
- Android网络类型判断(2g、3g、wifi)
- Android如何检测网络的类型为3G、2G、wap、wifi
- Android网络类型判断(2g、3g、wifi)
- iphone最牛判断当前手机网络连接类型wifi-2G-3G-4G-5G
- Android判断网络类型的方法(2g,3g还是wifi)
- Android如何检测网络的类型为3G、2G、wap、wifi
- Android网络类型判断(2g、3g、wifi)(待续)
- android判断正在使用的网络类型 0.不知道网络类型;1、2G;2、3G;3、4g;4、wifi
- Android如何检测网络的类型为3G、2G、wap、wifi
- Android网络类型判断(2g、3g、wifi)
- Android网络类型判断(2g、3g、wifi) .