Ael*_*exe 5 android signal-strength
我目前正在为希望以设定的时间间隔收集有关信号强度的数据的客户编写应用程序.
目前我正在使用此代码:
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()));
}
};
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是客户端想要两个级别的信号强度(我猜多少条?),DBM和ASU.
任何人都有任何线索如何使用这些不同的形式阅读信号强度?
正如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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 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* 方法是否存在并调用它。
| 归档时间: |
|
| 查看次数: |
13322 次 |
| 最近记录: |