在 AndroidManifest.xml
中添加读取手机状态的权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
通过 TelephonyManager
的 getNetworkType()
方法获取原始网络类型值,再映射为可读的字符串。
import android.content.Context; import android.telephony.TelephonyManager; public class NetworkUtils { public static String getNetworkType(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager == null) { return "Unknown"; } int networkType = telephonyManager.getNetworkType(); switch (networkType) { case TelephonyManager.NETWORK_TYPE_NR: return "5G/NR"; case TelephonyManager.NETWORK_TYPE_LTE: return "4G/LTE"; case TelephonyManager.NETWORK_TYPE_HSPAP: return "3G+"; case TelephonyManager.NETWORK_TYPE_HSDPA: return "3G"; case TelephonyManager.NETWORK_TYPE_HSUPA: return "3G"; case TelephonyManager.NETWORK_TYPE_UMTS: return "3G"; case TelephonyManager.NETWORK_TYPE_EVDO_0: return "CDMA EVDO Rev.0"; case TelephonyManager.NETWORK_TYPE_EVDO_A: return "CDMA EVDO Rev.A"; case TelephonyManager.NETWORK_TYPE_EVDO_B: return "CDMA EVDO Rev.B"; case TelephonyManager.NETWORK_TYPE_EHRPD: return "eHRPD"; case TelephonyManager.NETWORK_TYPE_HSPA: return "3G"; case TelephonyManager.NETWORK_TYPE_HSPAP: return "3G+"; case TelephonyManager.NETWORK_TYPE_IDEN: return "iDEN"; case TelephonyManager.NETWORK_TYPE_LTE_CA: return "4G+"; // LTE Carrier Aggregation case TelephonyManager.NETWORK_TYPE_UNKNOWN: return "Unknown"; default: return "Unknown"; } } }
常量名称 | 值 | 网络类型描述 |
---|---|---|
NETWORK_TYPE_NR | 19 | 5G/NR |
NETWORK_TYPE_LTE | 13 | 4G/LTE |
NETWORK_TYPE_HSPAP | 15 | 3G+ (HSPA+) |
NETWORK_TYPE_HSDPA | 8 | 3G (HSDPA) |
NETWORK_TYPE_HSUPA | 9 | 3G (HSUPA) |
NETWORK_TYPE_UMTS | 3 | 3G |
NETWORK_TYPE_EVDO_0 | 4 | CDMA EVDO Rev.0 |
NETWORK_TYPE_EVDO_A | 5 | CDMA EVDO Rev.A |
NETWORK_TYPE_EVDO_B | 6 | CDMA EVDO Rev.B |
NETWORK_TYPE_EHRPD | 14 | eHRPD |
NETWORK_TYPE_HSPA | 10 | 3G |
NETWORK_TYPE_IDEN | 2 | iDEN |
NETWORK_TYPE_LTE_CA | 16 | 4G+ (载波聚合) |
NETWORK_TYPE_UNKNOWN | -1 | 未知 |
解答:
可通过 PhoneStateListener
监听网络变化,示例如下:
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener listener = new PhoneStateListener() { @Override public void onDataConnectionStateChanged(int state, int networkType) { super.onDataConnectionStateChanged(state, networkType); String type = getNetworkType(networkType); // 自定义方法映射网络类型 Log.d("NetworkChange", "Current Type: " + type); } }; telephonyManager.listen(listener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
解答:
结合 ConnectivityManager
和 TelephonyManager
判断:
import android.net.ConnectivityManager; import android.net.NetworkInfo; public boolean isUsingMobileData(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnected()) { // 检查是否是移动网络类型(非WiFi) return activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; } return false; }