2

有谁知道如何在不必调用 onSignalStrengthChanged 的​​情况下获得信号强度。onSignalStrengthchanged 的​​问题在于它是在信号强度变化时调用的,我需要根据不同的标准获取信号强度的值。

提前致谢。

4

4 回答 4

12

在 API 级别 17 上,这里有一些可以在Activity(或任何其他Context子类)中使用的代码:

import android.telephony.CellInfo;
import android.telephony.CellInfoCdma;
import android.telephony.CellInfoGsm;
import android.telephony.CellInfoLte;
import android.telephony.CellSignalStrengthCdma;
import android.telephony.CellSignalStrengthGsm;
import android.telephony.CellSignalStrengthLte;
import android.telephony.TelephonyManager;

try {
    final TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    for (final CellInfo info : tm.getAllCellInfo()) {
        if (info instanceof CellInfoGsm) {
            final CellSignalStrengthGsm gsm = ((CellInfoGsm) info).getCellSignalStrength();
            // do what you need
        } else if (info instanceof CellInfoCdma) {
            final CellSignalStrengthCdma cdma = ((CellInfoCdma) info).getCellSignalStrength();
            // do what you need
        } else if (info instanceof CellInfoLte) {
            final CellSignalStrengthLte lte = ((CellInfoLte) info).getCellSignalStrength();
            // do what you need
        } else {
            throw new Exception("Unknown type of cell signal!");
        }
    }
} catch (Exception e) {
    Log.e(TAG, "Unable to obtain cell signal information", e);
}

以前版本的 Android 要求您调用侦听器,没有其他选择(请参阅此链接)。

还要确保您的应用程序包含适当的权限。

于 2013-07-12T15:37:53.953 回答
0

您可以通过反射调用访问 SignalStrength。请通过链接执行http://blog.ajhodges.com/2013/03/reading-lte-signal-strength-rssi-in.html

于 2013-07-12T15:59:36.907 回答
0

Android 中还有另一个 API,称为 CellInfo。但我不确定 OnSignalStrengthsChanged() 和 CellInfo 返回的信号强度是否相同。

https://developer.android.com/reference/android/telephony/CellSignalStrength.html

于 2016-08-23T06:21:06.997 回答
0

根据上面 Andre 的回答,在 Kotlin 中,您可以使用这个单线(API 17+):

fun getRadioSignalLevel(): Int {
  return when (val info = telephonyManager.allCellInfo?.firstOrNull()) {
    is CellInfoLte   -> info.cellSignalStrength.level
    is CellInfoGsm   -> info.cellSignalStrength.level
    is CellInfoCdma  -> info.cellSignalStrength.level
    is CellInfoWcdma -> info.cellSignalStrength.level
    else             -> 0
  }
}
于 2019-02-08T02:03:53.913 回答