Android网络状态判断与处理

时间:2021-7-9 作者:qvyue

在项目的开发过程中 , 我们的应用程序都是在有网络的情况下进行处理的 , 但我们也要考虑到在没有网络的情况下,应用会出现什么样的情况 , 所以我们需要获取到当前的网络信息.

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。

1)判断是否有网络连接

public boolean isNetworkConnected(Context context) {  
      if (context != null) {  
          ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                  .getSystemService(Context.CONNECTIVITY_SERVICE);  
          NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
          if (mNetworkInfo != null) {  
              return mNetworkInfo.isAvailable();  
          }  
      }  
     return false;  
 }  

2)判断WIFI网络是否可用

public boolean isWifiConnected(Context context) {  
     if (context != null) {  
          ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                  .getSystemService(Context.CONNECTIVITY_SERVICE);  
          NetworkInfo mWiFiNetworkInfo = mConnectivityManager  
                  .getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
          if (mWiFiNetworkInfo != null) {  
              return mWiFiNetworkInfo.isAvailable();  
          }  
     }  
     return false;  
 }  

3)判断MOBILE网络是否可用

 public boolean isMobileConnected(Context context) {  
      if (context != null) {  
          ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                  .getSystemService(Context.CONNECTIVITY_SERVICE);  
          NetworkInfo mMobileNetworkInfo = mConnectivityManager  
                  .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);  
          if (mMobileNetworkInfo != null) {  
              return mMobileNetworkInfo.isAvailable();  
          }  
     }  
     return false;  
 }  

4)获取当前网络连接的类型信息

public static int getConnectedType(Context context) {  
      if (context != null) {  
          ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                  .getSystemService(Context.CONNECTIVITY_SERVICE);  
          NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
          if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {  
              return mNetworkInfo.getType();  
         }  
      }  
     return -1;  
 }  

在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒。一般可以通过ConnectivityManager来完成该工作。

ConnectivityManager有四个主要任务:
1、监听手机网络状态(包括GPRS,WIFI, UMTS等)
2、手机状态发生改变时,发送广播
3、当一个网络连接失败时进行故障切换
4、为应用程序提供可以获取可用网络的高精度和粗糙的状态

当我们要在程序中监听网络状态时,只要一下几个步骤即可:

1、定义一个Receiver重载其中的onReceive函数,在其中完成所需要的功能,如根据WIFI和GPRS是否断开来改变空间的外观

connectionReceiver = new BroadcastReceiver() {

   @Override
   public void onReceive(Context context, Intent intent) {
    ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
     Log.i(TAG, "unconnect");
     // unconnect network
     }else {

    // connect network
     }
   }
  };

2、在适当的地方注册Receiver,可以在程序中注册,在onCreate中调用如下函数即可:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(connectionReceiver, intentFilter);

3、在适当时取消注册Receiver,可以在程序中取消,在onDestroye中调用如下函数即可:

if (connectionReceiver != null) {
   unregisterReceiver(connectionReceiver);
}

很多朋友在android开发中,都会遇到手机网络类型判断,因为就目前的android平台手机来说:可能会存在4种状态:

1.无网络(这种状态可能是因为手机停机,网络没有开启,信号不好等原因)
2.使用WIFI上网
3.CMWAP(中国移动代理)
4.CMNET上网

这四种状态,如果没有网络,肯定是无法请求Internet了,如果是wap就需要为手机添加中国移动代理.
下面是网络判断的方法:

 /**
    * 获取当前的网络状态  -1:没有网络  1:WIFI网络  2:wap网络  3:net网络
    */ 
    public static int getAPNType(Context context){

         int netType = -1;

         ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
         if(networkInfo==null){ 
             return netType; 
         }
         int nType = networkInfo.getType();
         if(nType==ConnectivityManager.TYPE_MOBILE){
             if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){ 
                 netType = CMNET; 
             } 
             else{ 
                netType = CMWAP; 
             } 
         } 
         else if(nType==ConnectivityManager.TYPE_WIFI){
             netType = WIFI; 
         } 
         return netType; 
     } 

因为获取的是服务对象,所以这个网络状态都是时时刷新的,所以我们只需要得到网络状态就可以了!

最后总结:
工具类:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetUtils {

    /**
     * 判断是否有网络连接
     */
    public static boolean isNetworkConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null) {
                return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    /**
     * 判断WIFI网络是否可用
     */
    public static boolean isWifiConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mWiFiNetworkInfo = mConnectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (mWiFiNetworkInfo != null) {
                return mWiFiNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    /**
     * 判断MOBILE网络是否可用
     */
    public static boolean isMobileConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mMobileNetworkInfo = mConnectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if (mMobileNetworkInfo != null) {
                return mMobileNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    /**
     * 获取当前网络连接的类型信息
     */
    public static int getConnectedType(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
                return mNetworkInfo.getType();
            }
        }
        return -1;
    }

    /**
     * 获取当前的网络状态  -1:没有网络  1:WIFI网络2:wap网络3:net网络
     */
    private static final int NONET = -1;
    private static final int WIFI = 1;
    private static final int CMWAP = 2;
    private static final int CMNET = 3;

    public static int getAPNType(Context context) {

        int netType = NONET;
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

        if (networkInfo == null) {
            return netType;
        }

        int nType = networkInfo.getType();
        if (nType == ConnectivityManager.TYPE_MOBILE) {
            if (networkInfo.getExtraInfo().toLowerCase().equals("cmnet")) {
                netType = CMNET;
            } else {
                netType = CMWAP;
            }
        } else if (nType == ConnectivityManager.TYPE_WIFI) {
            netType = WIFI;
        }
        return netType;
    }
}

BaseActivity:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class BaseActivity extends AppCompatActivity {

    private static final String TAG = "BaseActivity";
    private final BroadcastReceiver connectionReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
            NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
                Log.i(TAG, "网络连接失败---跳转网络连接失败页面");
            }else {
                Log.i(TAG, "网络连接成功");
            }
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(connectionReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (connectionReceiver != null) {
            unregisterReceiver(connectionReceiver);
        }
    }
}

MainActivity

package com.hjy.netapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.util.Log;

import com.hjy.netapplication.utils.NetUtils;

public class MainActivity extends BaseActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 这个广播可以写在BaseActivity中,这里做测试
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(broadcastReceiver, intentFilter);
    }

    private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            boolean networkConnected = NetUtils.isNetworkConnected(getApplicationContext());
            Log.d(TAG, "判断是否有网络连接--->" + networkConnected);

            boolean wifiConnected = NetUtils.isWifiConnected(getApplicationContext());
            Log.d(TAG, "判断WIFI网络是否可用--->" + wifiConnected);

            boolean mobileConnected = NetUtils.isMobileConnected(getApplicationContext());
            Log.d(TAG, "判断MOBILE网络是否可用--->" + mobileConnected);

            int connectedType = NetUtils.getConnectedType(getApplicationContext());
            Log.d(TAG, "获取当前网络连接的类型信息--->" + connectedType);

            //-1:没有网络  1:WIFI网络 2:wap网络 3:net网络
            int apnType = NetUtils.getAPNType(getApplicationContext());
            switch (apnType) {
                case -1:
                    Log.d(TAG, "获取当前的网络状态--->没有网络");
                    break;
                case 1:
                    Log.d(TAG, "获取当前的网络状态--->WIFI网络");
                    break;
                case 2:
                    Log.d(TAG, "获取当前的网络状态--->wap网络");
                    break;
                case 3:
                    Log.d(TAG, "获取当前的网络状态--->net网络");
                    break;
            }
        }
    };
}

Log日志

 网络连接成功
 判断是否有网络连接--->true
 判断WIFI网络是否可用--->true
 判断MOBILE网络是否可用--->true
 获取当前网络连接的类型信息--->0
 获取当前的网络状态--->net网络
 网络连接失败---跳转网络连接失败页面
 判断是否有网络连接--->false
 判断WIFI网络是否可用--->true
 判断MOBILE网络是否可用--->true
 获取当前网络连接的类型信息--->-1
 获取当前的网络状态--->没有网络
 网络连接成功
 判断是否有网络连接--->true
 判断WIFI网络是否可用--->true
 判断MOBILE网络是否可用--->true
 获取当前网络连接的类型信息--->1
 获取当前的网络状态--->WIFI网络
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。