我目前正在为希望按设定的时间间隔收集有关信号强度的数据的客户编写应用程序。
目前我正在使用此代码:
private static class MyPhoneStateListener extends PhoneStateListener
{
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength)
{
super.onSignalStrengthsChanged(signalStrength);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
InfoStore.setSignal(String.valueOf(signalStrength.getGsmSignalStrength()));
}
};
这样可以正常工作,但是客户端想要两个级别的信号强度(我猜多少条?),DBM和ASU。
任何人都有任何线索如何使用这些不同形式阅读信号强度?
答案 0 :(得分:8)
正如Charles Ma和Kevin Krumwiede所提到的,相关的Android方法是隐藏的(可能是有充分理由的),但仍然可以通过反射来获取值。因此,原始问题的一个解决方案:
private class MyPhoneStateListener extends PhoneStateListener
{
public static final int INVALID = Integer.MAX_VALUE;
public int signalStrengthDbm = INVALID;
public int signalStrengthAsuLevel = INVALID;
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength)
{
signalStrengthDbm = getSignalStrengthByName(signalStrength, "getDbm");
signalStrengthAsuLevel = getSignalStrengthByName(signalStrength, "getAsuLevel");
}
private int getSignalStrengthByName(SignalStrength signalStrength, String methodName)
{
try
{
Class classFromName = Class.forName(SignalStrength.class.getName());
java.lang.reflect.Method method = classFromName.getDeclaredMethod(methodName);
Object object = method.invoke(signalStrength);
return (int)object;
}
catch (Exception ex)
{
return INVALID;
}
}
}
答案 1 :(得分:2)
在android 4.x中,SignalStrength类具有getAsuLevel,getDbm以及getLevel(bars)方法。
如果您需要这个适用于较旧的Android版本,请查看源代码,然后您可以复制这些方法的实现。 http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/telephony/SignalStrength.java/
你唯一不能得到的是旧版Android中的Lte测量,但你可以使用java反射来查看getLte *方法是否存在并调用它。
答案 2 :(得分:0)
按
计算dBmint SignalStrength_ASU = signalStrength.getGsmSignalStrength();
int SignalStrength_dBm = (2 * SignalStrength_ASU) - 113; // -> dBm