ConnectivityManager.getActiveNetworkInfo()
获取当前网络类型,若
NetworkInfo.getSubtype()
返回值为2(EDGE)或3(GPRS)等,则判定为2G网络,需注意不同设备厂商可能存在差异
2G(Second Generation)是移动通信的第二代技术,主要提供语音通话和低速数据传输服务(如GPRS、EDGE),在安卓系统中,判断当前网络是否为2G需要结合网络类型标识和信号特征。
安卓通过TelephonyManager
的getNetworkType()
或getNetworkClass()
方法获取网络类型,注意:
getNetworkType()
被废弃,需改用getNetworkClass()
或NetworkCapabilities
。android.permission.READ_PHONE_STATE
和ACCESS_FINE_LOCATION
。import android.content.Context; import android.telephony.TelephonyManager; import android.os.Build; import androidx.annotation.RequiresApi; public class NetworkUtils { public static String getNetworkType(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (tm == null) return "Unknown"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // API 29+ return tm.getNetworkType() + ""; // 直接返回整数值 } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+ return tm.getNetworkType() + ""; // 仍可用,但已标记废弃 } else { // 低版本兼容逻辑(如API < 23) switch (tm.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: return "2G"; case TelephonyManager.NETWORK_TYPE_UMTS: return "3G"; case TelephonyManager.NETWORK_TYPE_LTE: return "4G"; default: return "Unknown"; } } } }
网络类型常量 | 值 | 说明 |
---|---|---|
NETWORK_TYPE_GPRS |
1 | 2G(GPRS) |
NETWORK_TYPE_EDGE |
2 | 2G(EDGE) |
NETWORK_TYPE_UMTS |
3 | 3G(UMTS) |
NETWORK_TYPE_LTE |
13 | 4G(LTE) |
NETWORK_TYPE_NR |
20 | 5G(NR) |
import android.content.BroadcastReceiver; import android.content.IntentFilter; import android.telephony.TelephonyManager; import android.net.ConnectivityManager; public class NetworkStateReceiver extends BroadcastReceiver { private Context context; public NetworkStateReceiver(Context context) { this.context = context; } public void register() { IntentFilter filter = new IntentFilter(); filter.addAction(TelephonyManager.ACTION_NETWORK_CLASS_CHANGED); // API 26+ filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // 通用网络变化广播 context.registerReceiver(this, filter); } @Override public void onReceive(Context context, Intent intent) { if (TelephonyManager.ACTION_NETWORK_CLASS_CHANGED.equals(intent.getAction())) { int networkClass = intent.getIntExtra(TelephonyManager.EXTRA_NETWORK_CLASS, -1); if (networkClass == TelephonyManager.NETWORK_CLASS_2_G) { // 当前是2G网络 } } } }
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-部分API需要定位权限 -->
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE); }
getNetworkType
(不推荐,可能导致兼容性问题)。解答:
NETWORK_TYPE_UMTS
(值为3)或NETWORK_CLASS_3_G
。 NETWORK_TYPE_LTE
(值为13)或NETWORK_CLASS_4_G
。 NETWORK_TYPE_NR
(值为20)或NETWORK_CLASS_5_G
。TelephonyManager.getNetworkClass()
可直接获取分类值(如NETWORK_CLASS_2_G
)。解答:
TelephonyManager.getNetworkType()
返回-1
)。 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent);