我正在使用来自HTC Thunderbolt的Verizon新款LTE手机。当手机在LTE上时,我找不到用于查询信号强度的API。通过进入现场测试模式(##4636##),我可以看到信号强度为-98dBm 2 asu。任何人都知道我可以用什么API来获取这些信息?
答案 0 :(得分:17)
警告:此解决方案适用于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);
}
}
再见
答案 1 :(得分:13)
为了解决这个问题,我创建了一个名为Signal Strength Detector的应用程序,并在GitHub上创建了源代码。根据我过去的经验,一些运行Android ICS 4.0及更高版本的设备在getLevel
上有一个SignalStrength
方法,它返回一个0到4的整数,报告信号强度。在其他一些LTE设备上(我不相信HTC Thunderbolt),有一些方法,如getLteCqi
getLteRsrp
getLteRsrq
和getLteRssnr
,我将留给您确定如何使用这些值来计算信号强度。最后,我发现在某些设备上(我相信HTC Thunderbolt),LTE信号强度实际上是用标有GSM信号强度的方法报告的!这很疯狂,但却是真的。您可以随意下载信号强度检测器并在设备上查看结果和/或根据需要修改代码。
作为旁注,您需要使用Reflection来访问这些方法,我将再次告诉您确定如何最好地实现这些方法。这很简单,但你需要做很多try-catch来确定方法是否存在,有时setAccessible(true)
只是忽略私有方法的任何问题。
希望这有帮助!
答案 2 :(得分:7)
这是一个示例应用程序的完整工作实现,它使用反射来获得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());
}
}
}
答案 3 :(得分:-1)
您需要使用PhoneStateListener注册LISTEN_SIGNAL_STRENGTHS。然后,您将获得具有当前信号强度的回调,以及将来带有更新的回调。