15

我正在使用来自 HTC Thunderbolt 的 Verizon 新 LTE 手机。当手机在 LTE 上时,我找不到用于查询信号强度的 API。通过进入现场测试模式(## 4636## ,我可以看到信号强度为 -98dBm 2 asu。任何人都知道我可以使用什么 API 来获取这些信息?

4

4 回答 4

16

警告:此解决方案应适用于 API17 以下的 Android。有些人可能对较新的 api 或特定手机品牌(如华为)有问题

您需要使用此代码。事实上,您需要的所有信息都在这里:

String ssignal = signalStrength.toString();

String[] parts = ssignal.split(" ");

然后该parts[]数组将包含以下元素:

part[0] = "Signalstrength:"  _ignore this, it's just the title_

parts[1] = GsmSignalStrength

parts[2] = GsmBitErrorRate

parts[3] = CdmaDbm

parts[4] = CdmaEcio

parts[5] = EvdoDbm

parts[6] = EvdoEcio

parts[7] = EvdoSnr

parts[8] = LteSignalStrength

parts[9] = LteRsrp

parts[10] = LteRsrq

parts[11] = LteRssnr

parts[12] = LteCqi

parts[13] = gsm|lte|cdma

parts[14] = _not really sure what this number is_

所以,LTEdBm 是:

TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

int dbm = 0;

if ( tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE){

    // For Lte SignalStrength: dbm = ASU - 140.
    dbm = Integer.parseInt(parts[8])-140;

}
else{

    // For GSM Signal Strength: dbm =  (2*ASU)-113.
    if (signalStrength.getGsmSignalStrength() != 99) {
                    int intdbm = -113 + 2
                            * signalStrength.getGsmSignalStrength();
                    dbm = Integer.toString(intdbm);
                }
}

再见

于 2013-05-06T09:39:45.067 回答
14

为了解决这个问题,我创建了一个名为 Signal Strength Detector 的应用程序,并在GitHub 上提供了源代码。根据我过去的经验,一些运行 Android ICS 4.0 及更高版本的设备有一个getLevel方法,SignalStrength该方法返回一个从 0 到 4 的整数来报告信号强度。在其他一些 LTE 设备(我不相信 HTC Thunderbolt)上,有一些方法,比如getLteCqi getLteRsrp getLteRsrqgetLteRssnr我将留给您确定如何使用这些值来计算信号强度。最后,我发现在某些设备(我相信是 HTC Thunderbolt)上,LTE 信号强度实际上是使用标记为 GSM 信号强度的方法报告的!这很疯狂,但确实如此。随意下载 Signal Strength Detector 并在您的设备上查看结果和/或根据需要修改代码。

作为旁注,您将需要使用反射来访问这些方法,我将再次留给您确定如何最好地实现这一点。这相当简单,但是您需要做很多 try-catch 来确定该方法是否存在,有时setAccessible(true)只是忽略私有方法的任何问题。

希望这可以帮助!

于 2012-01-08T23:01:27.507 回答
9

这是一个示例应用程序的完整工作实现,它使用反射来获取 LTE 信号强度:

import java.lang.reflect.Method;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Log;

public class MainActivity extends Activity
{
    /*
     * Some significant methods for LTE: getLteSignalStrength, getLteRssi,
     * getLteRsrp and getRsrq. RSRP provides information about signal strength
     * and RSSI helps in determining interference and noise information. RSRQ
     * (Reference Signal Receive Quality) measurement and calculation is based
     * on both RSRP and RSSI.
     */

    private SignalStrength      signalStrength;
    private TelephonyManager    telephonyManager;
    private final static String LTE_TAG             = "LTE_Tag";
    private final static String LTE_SIGNAL_STRENGTH = "getLteSignalStrength";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        // Listener for the signal strength.
        final PhoneStateListener mListener = new PhoneStateListener()
        {
            @Override
            public void onSignalStrengthsChanged(SignalStrength sStrength)
            {
                signalStrength = sStrength;
                getLTEsignalStrength();
            }
        };

        // Register the listener for the telephony manager
        telephonyManager.listen(mListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
    }

    private void getLTEsignalStrength()
    {
            try
            {
                Method[] methods = android.telephony.SignalStrength.class.getMethods();

                for (Method mthd : methods)
                {
                    if (mthd.getName().equals(LTE_SIGNAL_STRENGTH))
                    {
                        int LTEsignalStrength = (Integer) mthd.invoke(signalStrength, new Object[] {});
                        Log.i(LTE_TAG, "signalStrength = " + LTEsignalStrength);
                        return;
                    }
                }
            }
            catch (Exception e)
            {
                Log.e(LTE_TAG, "Exception: " + e.toString());
            }
    }
}
于 2015-07-29T09:42:12.643 回答
-1

您需要使用LISTEN_SIGNAL_STRENGTHS注册PhoneStateListener。然后,您将收到带有当前信号强度的回调,以及带有更新的未来回调。

于 2011-04-05T00:40:32.460 回答