当前位置:首页 > 行业动态 > 正文

安卓判断2g网络

在Android中,可通过 ConnectivityManager.getActiveNetworkInfo()获取当前网络类型,若 NetworkInfo.getSubtype()返回值为2(EDGE)或3(GPRS)等,则判定为2G网络,需注意不同设备厂商可能存在差异

2G网络基础概念

2G(Second Generation)是移动通信的第二代技术,主要提供语音通话和低速数据传输服务(如GPRS、EDGE),在安卓系统中,判断当前网络是否为2G需要结合网络类型标识和信号特征。

安卓判断2g网络


通过TelephonyManager获取网络类型

核心方法

安卓通过TelephonyManagergetNetworkType()getNetworkClass()方法获取网络类型,注意:

  • API 28+限制getNetworkType()被废弃,需改用getNetworkClass()NetworkCapabilities
  • 权限要求:需声明android.permission.READ_PHONE_STATEACCESS_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);
}

注意事项

  1. 模拟器限制:安卓模拟器可能无法模拟2G网络,需在真实设备测试。
  2. 运营商差异:部分运营商可能将EDGE归类为2G,而其他场景可能视为2G到3G的过渡技术。
  3. 反射获取隐藏API:部分厂商定制系统可能隐藏网络类型,可通过反射调用getNetworkType(不推荐,可能导致兼容性问题)。

相关问题与解答

问题1:如何区分3G/4G/5G网络?

解答

安卓判断2g网络

  • 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:如果用户拒绝授予权限怎么办?

解答

安卓判断2g网络

  • 权限被拒绝后,相关API会返回默认值(如TelephonyManager.getNetworkType()返回-1)。
  • 应提示用户权限不足,并提供跳转至系统设置页面的选项:
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);