您的位置:首页 > 理论基础 > 计算机网络

判断网络是否可用以及当前手机的网络类型

2016-11-08 10:40 507 查看

前言

android的入门开发教程最近都没怎么更新,实在是抱歉,主要是最近公司的项目赶,实在是抽不出时间来写,但最近一定会补上。公司一直都没有配电脑,没办法,一个字:穷!我之前一直都用的我用了5年的华硕电脑,但是编译项目实在是太卡了。我实在是忍不了了。所以上个星期我新换了电脑,1w5的mac,真是贵。辛辛苦苦攒了大半年的工资,上一个月就全部被我败完了。- -真是罪过,罪过。不过换了mac我感觉我的工作效率提升了不少。所以我感觉这投资还是值得的,为自己投资嘛!呸,又扯远了!

前几天产品说了一个需求,需要在登陆页面的时候判断一下网络类型,这个问题我在之前的项目中遇到过,当时也没怎么想,所以就直接去百度搜来了粘贴上去了,这次又遇到了这样一个功能,于是又打算去百度搜。但是想了想,觉得总这样也不是个办法,所以自己就花时间总结了一下,顺便也完善了一下自己的几个工具类!

关于网络这方面的问题,我们可以使用的系统管理器有两个,TelephonyManager和ConnectivityManager, 前者主要是判断网络的类型,而后者主要是判断是否连接!例如我们在ConnectivityManager中判断网络类型常用的api主要有如下两种,不是wifi就是手机网络:

ConnectivityManager.TYPE_MOBILE –>手机网络类型为手机的网络

ConnectivityManager.TYPE_WIFI –>手机网络类型为wifi

当然ConnectivityManager可以判断的连接类型还有很多,比如蓝牙连接等。有兴趣的小伙伴可以查一查ConnectivityManager中其他的连接类型。这里我就不过多叙述了。

ConnectivityManager.TYPE_BLUETOOTH —>蓝牙连接

关于获取网络是否可用的问题

//判断网络是否可用
public static boolean isNetworkConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnected();
}


备注:

如果仅仅是用来判断网络连接,则可以使用 cm.getActiveNetworkInfo().isAvailable();

需要添加访问网络状态权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


判断当前的网络类型,可判断wifi类型,2G,3G以及4G类型

// 判断网络类型
public static String getNetWorkType(Context context){
String netWorkState = "";
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE));
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()){
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI){
//网络状态为wifi
netWorkState = "WIFI";
return netWorkState;
}
else if(networkInfo.getType() == ConnectivityManager.TYPE_MOBILE){
//网络状态为手机
//判断手机网络是2g , 3g, 以及4g
//String subtypeName = networkInfo.getSubtypeName();
//System.out.println("网络类型: subtypeName:" + subtypeName);
//这里我根据的是电话管理器中的类型来进行判断,
//当然你也可以根据subtuypeName来判断,这个是从连接管理器中拿到的
int type = telephonyManager.getNetworkType();
System.out.println("网络类型: type:" + type);
switch (type){
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
netWorkState = "2G";
return netWorkState;
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
netWorkState = "3G";
return netWorkState;
case TelephonyManager.NETWORK_TYPE_LTE:
netWorkState = "4G";
return netWorkState;
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
netWorkState = "unknown network type";
return netWorkState;

}

}
}
return "";
}


总结

该封装的我已经都封装好了,我也测试了部分机器,我自己的手机和公司的测试机都能够识别所属网络类型,我觉得这个工具类应该可以满足大部分情况了,当然我自己也有考虑不周全的情况,如果发现了错误,请各位大神不吝指正,万分感谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android mac 网络