在Android开发中,常常使用到网络,可能需要针对不同的网络(WIFI或者流量),需要做不同的处理,那么怎么获取当前网络呢?为此写了个工具类,以后需要使用,直接拿来用就行(就喜欢拿来主义,哈哈)。

package com.wangguifa.phonestate;import android.content.Context;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.telephony.TelephonyManager;/** * Created by wangguifa on 2017/5/22 * 获取网络状态工具类 */public class NetUtils {    public static final int NETWORK_NONE = 0; // 没有网络连接    public static final int NETWORK_WIFI = 1; // wifi连接    public static final int NETWORK_2G = 2; // 2G    public static final int NETWORK_3G = 3; // 3G    public static final int NETWORK_4G = 4; // 4G    public static final int NETWORK_MOBILE = 5; // 手机流量    /**     * 获取运营商名字     *     * @param context context     * @return int     */    public static String getOperatorName(Context context) {        /*         * getSimOperatorName()就可以直接获取到运营商的名字         * 也可以使用IMSI获取,getSimOperator(),然后根据返回值判断,例如"46000"为移动         * IMSI相关链接:http://baike.baidu.com/item/imsi         */        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);        // getSimOperatorName就可以直接获取到运营商的名字        return telephonyManager.getSimOperatorName();    }    /**     * 获取当前网络连接的类型     *     * @param context context     * @return int     */    public static int getNetworkState(Context context) {        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 获取网络服务        if (null == connManager) { // 为空则认为无网络            return NETWORK_NONE;        }        // 获取网络类型,如果为空,返回无网络        NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo();        if (activeNetInfo == null || !activeNetInfo.isAvailable()) {            return NETWORK_NONE;        }        // 判断是否为WIFI        NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);        if (null != wifiInfo) {            NetworkInfo.State state = wifiInfo.getState();            if (null != state) {                if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {                    return NETWORK_WIFI;                }            }        }        // 若不是WIFI,则去判断是2G、3G、4G网        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);        int networkType = telephonyManager.getNetworkType();        switch (networkType) {            /*             GPRS : 2G(2.5) General Packet Radia Service 114kbps             EDGE : 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps             UMTS : 3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准             CDMA : 2G 电信 Code Division Multiple Access 码分多址             EVDO_0 : 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G             EVDO_A : 3G 1.8mbps - 3.1mbps 属于3G过渡,3.5G             1xRTT : 2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡,             HSDPA : 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps             HSUPA : 3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps             HSPA : 3G (分HSDPA,HSUPA) High Speed Packet Access             IDEN : 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科)             EVDO_B : 3G EV-DO Rev.B 14.7Mbps 下行 3.5G             LTE : 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE Advanced 才是4G             EHRPD : 3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级             HSPAP : 3G HSPAP 比 HSDPA 快些             */            // 2G网络            case TelephonyManager.NETWORK_TYPE_GPRS:            case TelephonyManager.NETWORK_TYPE_CDMA:            case TelephonyManager.NETWORK_TYPE_EDGE:            case TelephonyManager.NETWORK_TYPE_1xRTT:            case TelephonyManager.NETWORK_TYPE_IDEN:                return NETWORK_2G;            // 3G网络            case TelephonyManager.NETWORK_TYPE_EVDO_A:            case TelephonyManager.NETWORK_TYPE_UMTS:            case TelephonyManager.NETWORK_TYPE_EVDO_0:            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:                return NETWORK_3G;            // 4G网络            case TelephonyManager.NETWORK_TYPE_LTE:                return NETWORK_4G;            default:                return NETWORK_MOBILE;        }    }    /**     * 判断网络是否连接     *     * @param context context     * @return true/false     */    public static boolean isNetConnected(Context context) {        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        if (connectivity != null) {            NetworkInfo info = connectivity.getActiveNetworkInfo();            if (info != null && info.isConnected()) {                if (info.getState() == NetworkInfo.State.CONNECTED) {                    return true;                }            }        }        return false;    }    /**     * 判断是否wifi连接     *     * @param context context     * @return true/false     */    public static synchronized boolean isWifiConnected(Context context) {        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        if (connectivityManager != null) {            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();            if (networkInfo != null) {                int networkInfoType = networkInfo.getType();                if (networkInfoType == ConnectivityManager.TYPE_WIFI || networkInfoType == ConnectivityManager.TYPE_ETHERNET) {                    return networkInfo.isConnected();                }            }        }        return false;    }}

  上面的注释已经很清楚了,应该都能看懂。讲此工具类直接复制到项目即可,复制完了以后别忘了加权限,获取网络状态是需要权限的:

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

  这样就大功告成,下面来测试一下吧:



4G网络状态



无网络状态



WIFI状态

  通过上面测试,可以看出可以获得运营商和网络状态,证明是可以使用的。由于手机卡有限,只测试了楼主自己的,若有获取错误的请联系我及时增加。
  将自己工作和学习中的常用工具整理出来,以后直接用就行,不用再去写,以后还会不定期增加各种常用的工具类,也欢迎提出你需要的工具类,由我来整理。

更多相关文章

  1. Android设置透明状态栏,仿ios状态栏
  2. Android(安卓)SDK Manager 无法更新解决办法
  3. Android(安卓)Edittext获取焦点和失去焦点事件
  4. 获取Android崩溃crash信息并写入日志发送邮件
  5. cocos2d-x 里获取 android apk icon
  6. Android(安卓)获取assets绝对路径
  7. android之客户端从服务端解析数据及上传与反馈数据
  8. Android(安卓)PendingIntent的一些小迷惑
  9. android在view.requestFocus(0)返回false的解决办法

随机推荐

  1. Android的内存泄漏和调试
  2. android 中一个工程引用另一个工程
  3. Android内存阀值修改--内存回收机制配置
  4. android listview局部刷新和模拟应用下载
  5. Google宣布Android暂停开源
  6. Android(安卓)多线程-----AsyncTask详解
  7. Android用户近60%仍使用2.3版本 4.0版本
  8. android设备你所应该知道的Android设计
  9. Android(安卓)Studio下Java Jni技术
  10. 谷歌使用AndroidX代替Android支持库