package com.bgycc.smartcanteen.utils; import android.content.Context; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.os.Build; import androidx.annotation.NonNull; import com.bgycc.smartcanteen.R; import com.blankj.utilcode.util.LogUtils; import static com.bgycc.smartcanteen.utils.SmartCanteenUtils.TAG; public class NetworkHelper { private static ConnectivityManager connectivityManager; private static int transportType = NetworkCapabilities.TRANSPORT_WIFI; public static void initialize(Context context) { connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } public static String getNetworkType(Context context) { switch (transportType) { case NetworkCapabilities.TRANSPORT_ETHERNET: return context.getString(R.string.network_type_ethernet); case NetworkCapabilities.TRANSPORT_WIFI: return context.getString(R.string.network_type_wifi); default: return context.getString(R.string.network_type_unknown); } } public static synchronized void switchNetwork() { if (transportType == NetworkCapabilities.TRANSPORT_ETHERNET) { requestWifi(); } else { requestEthernet(); } } private static void requestEthernet() { if (connectivityManager == null) { LogUtils.w(TAG, "ConnectivityManager should be initialize before use"); return; } int targetTransportType = NetworkCapabilities.TRANSPORT_ETHERNET; if (!hasTransport(targetTransportType)) { LogUtils.d(TAG, "当前设备不支持通过以太网链接网络"); return; } transportType = targetTransportType; LogUtils.d(TAG, "网络切换至以太网"); NetworkRequest request = new NetworkRequest.Builder() .addTransportType(transportType) .build(); connectivityManager.requestNetwork(request, createCallback()); } private static void requestWifi() { if (connectivityManager == null) { LogUtils.w(TAG, "ConnectivityManager should be initialize before use"); return; } int targetTransportType = NetworkCapabilities.TRANSPORT_WIFI; if (!hasTransport(targetTransportType)) { LogUtils.d(TAG, "当前设备不支持通过Wifi链接网络"); return; } transportType = targetTransportType; LogUtils.d(TAG, "网络切换至Wifi"); NetworkRequest request = new NetworkRequest.Builder() .addTransportType(transportType) .build(); connectivityManager.requestNetwork(request, createCallback()); } private static boolean hasTransport(int transportType) { Network[] networks = connectivityManager.getAllNetworks(); NetworkCapabilities capabilities; for (Network n : networks) { capabilities = connectivityManager.getNetworkCapabilities(n); if (capabilities == null) continue; if (capabilities.hasTransport(transportType)) { return true; } } return false; } private static ConnectivityManager.NetworkCallback createCallback() { return new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); LogUtils.i(TAG, "网络切换成功: " + network); if (Build.VERSION.SDK_INT >= 23) { connectivityManager.bindProcessToNetwork(network); } else { ConnectivityManager.setProcessDefaultNetwork(network); } connectivityManager.unregisterNetworkCallback(this); } @Override public void onUnavailable() { super.onUnavailable(); LogUtils.i(TAG, "网络切换失败: " + transportType); } }; } }