上一篇
安卓判断2g网络
- 行业动态
- 2025-04-24
- 3689
在Android中,可通过
ConnectivityManager.getActiveNetworkInfo()
获取当前网络类型,若NetworkInfo.getSubtype()
返回值为2(EDGE)或3(GPRS)等,则判定为2G网络,需注意不同设备厂商可能存在差异 2G网络基础概念
2G(Second Generation)是移动通信的第二代技术,主要提供语音通话和低速数据传输服务(如GPRS、EDGE),在安卓系统中,判断当前网络是否为2G需要结合网络类型标识和信号特征。
通过TelephonyManager获取网络类型
核心方法
安卓通过TelephonyManager
的getNetworkType()
或getNetworkClass()
方法获取网络类型,注意:
- API 28+限制:
getNetworkType()
被废弃,需改用getNetworkClass()
或NetworkCapabilities
。 - 权限要求:需声明
android.permission.READ_PHONE_STATE
和ACCESS_FINE_LOCATION
。
代码示例(兼容新旧API)
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"; } } } }
网络类型与2G对应表
网络类型常量 | 值 | 说明 |
---|---|---|
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) |
通过BroadcastReceiver监听网络变化
注册网络状态广播
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需要定位权限 -->
动态权限申请(Android 6.0+)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE); }
注意事项
- 模拟器限制:安卓模拟器可能无法模拟2G网络,需在真实设备测试。
- 运营商差异:部分运营商可能将EDGE归类为2G,而其他场景可能视为2G到3G的过渡技术。
- 反射获取隐藏API:部分厂商定制系统可能隐藏网络类型,可通过反射调用
getNetworkType
(不推荐,可能导致兼容性问题)。
相关问题与解答
问题1:如何区分3G/4G/5G网络?
解答:
- 3G对应
NETWORK_TYPE_UMTS
(值为3)或NETWORK_CLASS_3_G
。 - 4G对应
NETWORK_TYPE_LTE
(值为13)或NETWORK_CLASS_4_G
。 - 5G对应
NETWORK_TYPE_NR
(值为20)或NETWORK_CLASS_5_G
。
通过TelephonyManager.getNetworkClass()
可直接获取分类值(如NETWORK_CLASS_2_G
)。
问题2:如果用户拒绝授予权限怎么办?
解答:
- 权限被拒绝后,相关API会返回默认值(如
TelephonyManager.getNetworkType()
返回-1
)。 - 应提示用户权限不足,并提供跳转至系统设置页面的选项:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent);