Android 如何获得当前小区信号强度?

Android 如何获得当前小区信号强度?,android,telephony,Android,Telephony,我想存储细胞信号强度,我这样做: private class GetRssi extends PhoneStateListener { @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); Variables.signal = signalStren

我想存储细胞信号强度,我这样做:

private class GetRssi extends PhoneStateListener {
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        Variables.signal = signalStrength.getGsmSignalStrength();


    }

}
好的,但只有当它改变时才会运行。我需要电流信号强度

有没有一种方法可以只询问当前信号强度?

API 17中添加的TelephonyManager中有一种方法可能是很好的解决方案。使用示例:

TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
// for example value of first element
CellInfoGsm cellInfoGsm = (CellInfoGsm)telephonyManager.getAllCellInfo().get(0);
CellSignalStrengthGsm cellSignalStrengthGsm = cellInfoGsm.getCellSignalStrength();
cellSignalStrengthGsm.getDbm();
CellSignalStrengthGsm()添加到API级别17中

CellSignalStrengthGsm().getDbm()将为您提供作为dBm的信号强度

 private static String getSignalStrength(Context context) throws SecurityException {
    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    String strength = null;
    List<CellInfo> cellInfos = telephonyManager.getAllCellInfo();   //This will give info of all sims present inside your mobile
    if(cellInfos != null) {
        for (int i = 0 ; i < cellInfos.size() ; i++) {
            if (cellInfos.get(i).isRegistered()) {
                if (cellInfos.get(i) instanceof CellInfoWcdma) {
                    CellInfoWcdma cellInfoWcdma = (CellInfoWcdma) cellInfos.get(i);
                    CellSignalStrengthWcdma cellSignalStrengthWcdma = cellInfoWcdma.getCellSignalStrength();
                    strength = String.valueOf(cellSignalStrengthWcdma.getDbm());
                } else if (cellInfos.get(i) instanceof CellInfoGsm) {
                    CellInfoGsm cellInfogsm = (CellInfoGsm) cellInfos.get(i);
                    CellSignalStrengthGsm cellSignalStrengthGsm = cellInfogsm.getCellSignalStrength();
                    strength = String.valueOf(cellSignalStrengthGsm.getDbm());
                } else if (cellInfos.get(i) instanceof CellInfoLte) {
                    CellInfoLte cellInfoLte = (CellInfoLte) cellInfos.get(i);
                    CellSignalStrengthLte cellSignalStrengthLte = cellInfoLte.getCellSignalStrength();
                    strength = String.valueOf(cellSignalStrengthLte.getDbm());
                } else if (cellInfos.get(i) instanceof CellInfoCdma) {
                    CellInfoCdma cellInfoCdma = (CellInfoCdma) cellInfos.get(i);
                    CellSignalStrengthCdma cellSignalStrengthCdma = cellInfoCdma.getCellSignalStrength();
                    strength = String.valueOf(cellSignalStrengthCdma.getDbm());
                }
            }
        }
    }
    return strength;
}
私有静态字符串getSignalStrength(上下文上下文)引发SecurityException{
TelephonyManager TelephonyManager=(TelephonyManager)context.getSystemService(context.TELEPHONY_服务);
字符串强度=空;
List cellInfos=telephonyManager.getAllCellInfo();//这将提供手机中所有SIM卡的信息
if(cellInfos!=null){
对于(int i=0;i
请注意,上述代码将返回列表中最后一个单元格的强度

您可以从以下方面了解更多信息:


CellInfoCdma、CellInfoGsm、CellInfoLte、CellInfoWcdma是CellInfo的子类。它提供了与移动网络相关的所有信息。

如果您使用的是SDK版本>28,则可以使用getSignalStrength()函数,如下所示:

telephonyManager.getSignalStrength().getLevel();
下面是一个完全实现的功能:

TelephonyManager telephonyManager;

...

int getCellularSignalStrength()  {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

        if(telephonyManager == null)
            telephonyManager = (TelephonyManager) common.appContext.getSystemService(Context.TELEPHONY_SERVICE);

        return telephonyManager.getSignalStrength().getLevel();
    }
    else
    {
        logRecorder.addWarningLog("Cannot read signal lvl on API lvl " + android.os.Build.VERSION.SDK_INT);
        return -1;
    }
}

如果您在应用程序启动时注册此侦听器,则您具有当前信号强度。它不会改变,直到你再次被监听器调用,此时你可以更新存储强度的内部变量。就像Ryan说的……如果你跟踪当前信号强度,那么你将永远知道它当前是什么!很好,但我使用了较低的api,我仍然投票赞成答案谢谢。只是提醒一下:一些设备(看看你的三星)似乎没有正确实现getAllCellInfo(),并将返回null。你还需要将此权限代码添加到清单中…@禁止地球工程的粗定位还是精定位?对我来说非常有效。我刚才也为
CellinfoCdma
添加了
if
分支。您可以编辑答案以添加适用于您的附加
CellinfoCdma
@Carlos.V,您也可以编辑答案-_-@阿南特拉辛格不,谢谢!:),你也可以编辑它jaja@AnanthRajSingh美好的