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

android获取网络信号强度

Android通过TelephonyManager的getSignalStrength()获取网络信号强度,需声明ACCESS_FINE_LOCATION权限,返回值单位为ASU,可转换为dB

Android获取网络信号强度的方法

移动网络信号强度(4G/5G)

  1. 权限配置
    需要在 AndroidManifest.xml 中声明以下权限:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    并在运行时动态申请权限(Android 6.0+)。

  2. 通过 TelephonyManager 获取信号强度

    import android.telephony.TelephonyManager;
    import android.telephony.CellInfo;
    import android.telephony.CellInfoGsm;
    import android.telephony.CellInfoLte;
    import android.telephony.CellSignalStrength;
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    List<CellInfo> cellInfoList = telephonyManager.getAllCellInfo();
    for (CellInfo cellInfo : cellInfoList) {
        if (cellInfo instanceof CellInfoGsm) {
            CellSignalStrengthGsm signalStrength = ((CellInfoGsm) cellInfo).getCellSignalStrength();
            int dBm = signalStrength.getDbm(); // 信号强度(dBm)
        } else if (cellInfo instanceof CellInfoLte) {
            CellSignalStrengthLte signalStrength = ((CellInfoLte) cellInfo).getCellSignalStrength();
            int dBm = signalStrength.getDbm();
        }
    }
  3. 信号强度范围

    android获取网络信号强度  第1张

    • dBm 值范围:-1999(无信号) ~ -51(最强信号)
    • 可转换为百分比显示:signalPercent = (dBm + 1999) / 1948 100

WiFi信号强度

  1. 权限配置
    需要在 AndroidManifest.xml 中声明:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  2. 通过 WifiManager 获取信号强度

    import android.net.wifi.WifiManager;
    import android.net.wifi.WifiInfo;
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int dBm = wifiInfo.getRssi(); // 信号强度(dBm)
  3. 信号强度范围

    • dBm 值范围:-100(最弱) ~ 0(最强)
    • 转换为百分比:signalPercent = (wifiInfo.getRssi() + 100) 100 / 100

信号强度对比表

网络类型 信号强度范围(dBm) 转换为百分比公式
移动网络 -1999 ~ -51 (dBm + 1999) / 1948 100
WiFi -100 ~ 0 (dBm + 100) 100 / 100

注意事项

  1. 动态权限申请

    • Android 6.0+ 需要动态申请 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION
    • 示例:
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
      }
  2. 兼容性问题

    • Android Q(10.0)及以上版本对 getAllCellInfo() 有更严格限制,需确保应用已获取必要权限。
    • 部分厂商定制系统可能返回空数据,需做空值校验。

相关问题与解答

问题1:如何判断当前网络类型(4G/WiFi/5G)?

解答
使用 ConnectivityManager 获取当前网络类型:

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null) {
    String type = networkInfo.getTypeName(); // "WIFI" 或 "MOBILE"
}

若为 MOBILE,可结合 TelephonyManager.getNetworkClass() 判断具体代际(3G/4G/5G)。


问题2:如何根据信号强度提示用户网络质量?

解答
定义信号阈值并显示提示:

int mobileSignal = telephonyManager.getNetworkSignalStrength(); // 伪代码,需实际调用接口
if (mobileSignal < -110) {
    // 信号差
    showToast("移动网络信号较弱,请检查周围环境");
} else if (mobileSignal > -80) {
    // 信号强
    showToast("移动网络
0