如何获取当前手机信号强度?

16

我想要存储手机信号强度,我是这样做的:

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


    }

}

好的,但这只有在它发生变化时才运行。我需要当前的信号强度。

是否有一种方法只是询问当前的信号强度?


1
如果你在应用程序启动时注册了这个监听器,那么你就可以获取当前信号强度。直到下一次监听器被调用之前,它不会改变。在此之后,你可以更新内部变量来存储信号强度。 - Ryan
就像Ryan所说的那样...如果你跟踪当前信号强度,那么你将始终知道它当前的状态! - Vorsprung
3个回答

29

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;
}
请注意,上述代码将返回列表中最后一个单元格的strength(强度)。
您可以从以下网站了解更多信息: https://developer.android.com/reference/android/telephony/CellInfo.html CellInfoCdma、CellInfoGsm、CellInfoLte和CellInfoWcdma是CellInfo的子类,提供有关移动网络的所有信息。

1
对我来说完美地工作了。我只是为CellinfoCdma也添加了if分支。 - Minoru
你可以编辑答案以添加额外的 CellInfoCdma - Carlos.V
@Carlos.V 这也适用于你,你本可以编辑答案的。-_- - Ananth
@AnanthRajSingh 不用了,谢谢!:) 你还可以编辑它 jaja - Carlos.V
1
@AnanthRajSingh 不错.. 你值得拥有它 - Carlos.V

23

在TelephonyManager中添加了一个名为getAllCellInfo()的方法,该方法适用于API 17。以下是使用示例:

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();

1
好的,但我使用较低级别的API,我仍然投票支持这个答案,谢谢。 - Adam Varhegyi
11
提醒一下:似乎一些设备(比如三星)没有正确实现getAllCellInfo(),会返回null。 - Tom Opgenorth
4
您还需要将此权限代码添加到您的清单文件中... <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> - ban-geoengineering
@禁止地理工程粗略位置或精细位置? - Karthikeyan Ve
我的IDE告诉我需要ACCESS_FINE_LOCATION权限(也需要ACCESS_COARSE_LOCATION)。 - kc_dev
显示剩余2条评论

4

如果您使用的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;
    }
}

对于简单的使用,这个答案更加简洁。 - kc_dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接