一. 前言 1. NetworkInfo的过时 Android 编译sdk版本为29时,NetworkInfo 过时了。
我们以前都是通过NetworkInfo的isConnected来判断网络是否连接,NetworkInfo的getType来判断网络连接类型。
2. NetworkCapabilities的使用 我们将使用NetworkCapabilities来代替NetworkInfo判断网络是否连接,以及网络的连接类型。
3. 记住在清单文件中添加网络状态查询权限 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?xml version="1.0" encoding="utf-8"?> <manifest  xmlns:android ="http://schemas.android.com/apk/res/android"      package ="swu.xl.networkstate" >          <uses-permission  android:name ="android.permission.ACCESS_NETWORK_STATE"  />      <application         android:allowBackup="true"         android:icon="@mipmap/ic_launcher"         android:label="@string/app_name"         android:roundIcon="@mipmap/ic_launcher_round"         android:supportsRtl="true"         android:theme="@style/AppTheme">         <activity  android:name =".MainActivity" >              <intent-filter >                  <action  android:name ="android.intent.action.MAIN"  />                  <category  android:name ="android.intent.category.LAUNCHER"  />              </intent-filter >          </activity >      </application >  </manifest > 
二. 判断当前网络是否连接 1. 是否联网的判断方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 private  boolean  isOnline (@NonNull  Context context)          ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);     assert  connectivityManager != null ;          if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                  Network network = connectivityManager.getActiveNetwork();         if (network != null ) {                          NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);             return  (networkCapabilities != null  && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET));         }     }else  {                  NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();         return  (networkInfo != null  && networkInfo.isConnected());     }     return  false ; } 
2. hasCapability 1 2 3 4 5 6 7 public  boolean  hasCapability (@NetCapability  int  capability) 
capability 可以是 NetworkCapabilities.NET_CAPABILITY_INTERNET ,更多的参数可以查看系统源码。
1 2 3 4 5 public  static  final  int  NET_CAPABILITY_INTERNET = 12 ;
3. 为什么使用 Build.VERSION_CODES.M 区分版本  getActiveNetwork 这个方法最低使用 API 是 Build.VERSION_CODES.M(23)。
三. 判断当前网络的状态 1. 网络状态的判断方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 private  boolean  testNetWorkState (@NonNull  Context context)          ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);     assert  connectivityManager != null ;          if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                  Network network = connectivityManager.getActiveNetwork();         if (network!=null ){                          NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);             if (networkCapabilities != null ){                 if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){                                          Toast.makeText(context, "WIFI" , Toast.LENGTH_SHORT).show();                     return  true ;                 }else  if (networkCapabilities.hasTransport(TRANSPORT_CELLULAR)){                                          Toast.makeText(context, "mobile" , Toast.LENGTH_SHORT).show();                     return  true ;                 }             }         }     }else  {                  NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();         if  (networkInfo != null ) {             if  (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {                                  Toast.makeText(context, "WIFI" , Toast.LENGTH_SHORT).show();                 return  true ;             } else  if  (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {                                  Toast.makeText(context, "mobile" , Toast.LENGTH_SHORT).show();                 return  true ;             }         }     }     return  false ; } 
2. hasTransport 1 2 3 4 5 6 7 8 9 public  boolean  hasTransport (@Transport  int  transportType)      return  isValidTransport(transportType) && ((mTransportTypes & (1  << transportType)) != 0 ); } 
transportType 参数的类型如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public  static  final  int  TRANSPORT_CELLULAR = 0 ;public  static  final  int  TRANSPORT_WIFI = 1 ;public  static  final  int  TRANSPORT_BLUETOOTH = 2 ;public  static  final  int  TRANSPORT_ETHERNET = 3 ;public  static  final  int  TRANSPORT_VPN = 4 ;public  static  final  int  TRANSPORT_WIFI_AWARE = 5 ;public  static  final  int  TRANSPORT_LOWPAN = 6 ;@TestApi public  static  final  int  TRANSPORT_TEST = 7 ;
四. 监听网络状态的变化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 public  class  MainActivity  extends  AppCompatActivity           ConnectivityManager.NetworkCallback callback = new  ConnectivityManager.NetworkCallback(){                           @Override          public  void  onCapabilitiesChanged (@NonNull  Network network, @NonNull  NetworkCapabilities networkCapabilities)                                     }                  @Override          public  void  onAvailable (@NonNull  Network network)                            Toast.makeText(MainActivity.this , "网络可用" , Toast.LENGTH_SHORT).show();         }                  @Override          public  void  onLost (@NonNull  Network network)                            Toast.makeText(MainActivity.this , "网络断开" , Toast.LENGTH_SHORT).show();         }     };          private  void  registerNetworkCallback (Context context)                    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);         assert  connectivityManager != null ;                  NetworkRequest.Builder builder = new  NetworkRequest.Builder();                                                      NetworkRequest networkRequest = builder.build();         connectivityManager.registerNetworkCallback(networkRequest,callback);     }          private  void  unregisterNetworkCallback (Context context)                    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);         assert  connectivityManager != null ;                  connectivityManager.unregisterNetworkCallback(callback);     }     @Override      protected  void  onCreate (Bundle savedInstanceState)           super .onCreate(savedInstanceState);         setContentView(R.layout.activity_main);     }     @Override      protected  void  onStart ()           super .onStart();         registerNetworkCallback(this );     }     @Override      protected  void  onStop ()           super .onStop();         unregisterNetworkCallback(this );     } } 
五. 源码参考 NetworkState 
参考文章 Android多网络环境(wifi,mobile)下强制在某个网络(mobile)访问服务端以及适配 
android权限(permission)大全 
Android网络状态获取类 在api 29中 NetworkInfo Deprecated 
android10解决NetworkInfo废弃替代NetworkInfo isConnected()问题 
android 5.0 以上监听网络变化