上一篇
android获取网络信号强度
- 行业动态
- 2025-05-03
- 4
Android通过TelephonyManager的getSignalStrength()获取网络信号强度,需声明ACCESS_FINE_LOCATION权限,返回值单位为ASU,可转换为dB
Android获取网络信号强度的方法
移动网络信号强度(4G/5G)
权限配置
需要在AndroidManifest.xml
中声明以下权限:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
并在运行时动态申请权限(Android 6.0+)。
通过 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(); } }
信号强度范围
- dBm 值范围:
-1999
(无信号) ~-51
(最强信号) - 可转换为百分比显示:
signalPercent = (dBm + 1999) / 1948 100
- dBm 值范围:
WiFi信号强度
权限配置
需要在AndroidManifest.xml
中声明:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
通过 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)
信号强度范围
- dBm 值范围:
-100
(最弱) ~0
(最强) - 转换为百分比:
signalPercent = (wifiInfo.getRssi() + 100) 100 / 100
- dBm 值范围:
信号强度对比表
网络类型 | 信号强度范围(dBm) | 转换为百分比公式 |
---|---|---|
移动网络 | -1999 ~ -51 | (dBm + 1999) / 1948 100 |
WiFi | -100 ~ 0 | (dBm + 100) 100 / 100 |
注意事项
动态权限申请
- Android 6.0+ 需要动态申请
ACCESS_FINE_LOCATION
或ACCESS_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); }
- Android 6.0+ 需要动态申请
兼容性问题
- Android Q(10.0)及以上版本对
getAllCellInfo()
有更严格限制,需确保应用已获取必要权限。 - 部分厂商定制系统可能返回空数据,需做空值校验。
- Android Q(10.0)及以上版本对
相关问题与解答
问题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("移动网络