Как получить силу сигнала LTE в Android?
Я использую Verizon новый LTE-телефон от HTC Thunderbolt. Я не могу найти API для запроса уровня сигнала, когда телефон работает на LTE. Вводя полевой тестовый режим (## 4636 ##), я вижу силу сигнала как -98dBm 2 asu. Кто-нибудь знает, какой API я могу использовать для получения этой информации?
Ответы
Ответ 1
Предупреждение: это решение должно работать для Android ниже API17. Некоторые люди могут иметь проблемы с новыми api или специфическими телефонами (например, Huawei)
Вам нужно использовать этот код. Фактически, вся необходимая информация находится здесь:
String ssignal = signalStrength.toString();
String[] parts = ssignal.split(" ");
Затем массив parts[]
будет содержать следующие элементы:
part[0] = "Signalstrength:" _ignore this, it 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);
}
}
до свидания
Ответ 2
Чтобы решить этот вопрос, я создал приложение под названием Signal Strength Detector и с исходным кодом GitHub. В моем прошлом опыте некоторые устройства под управлением Android ICS 4.0 и выше имеют метод getLevel
на SignalStrength
, который возвращает целое число от 0 до 4, сообщающее о силе сигнала. На некоторых других LTE-устройствах (я не верю HTC Thunderbolt) существуют некоторые методы, такие как getLteCqi
getLteRsrp
getLteRsrq
и getLteRssnr
, которые я оставлю вам, чтобы определить, как использовать эти значения для вычисления сигнала прочность. Наконец, я обнаружил, что на некоторых устройствах (я думаю, HTC Thunderbolt) уровень сигнала LTE на самом деле сообщается с помощью методов, обозначенных для уровня сигнала GSM! Это безумие, но это правда. Не стесняйтесь загружать детектор силы сигнала и проверять результаты на вашем устройстве и/или изменять код при необходимости.
В качестве побочного примечания вам нужно будет использовать Reflection для доступа к этим методам, и я оставлю вам, чтобы определить, как наилучшим образом реализовать это. Это довольно просто, но вам нужно сделать много попыток, чтобы определить, присутствует ли этот метод, а иногда и setAccessible(true)
просто игнорировать любые проблемы с частными методами.
Надеюсь, это поможет!
Ответ 3
Это полная рабочая реализация примерного приложения, которое использует отражение для получения уровня сигнала 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());
}
}
}
Ответ 4
Вам необходимо зарегистрировать PhoneStateListener с LISTEN_SIGNAL_STRENGTHS. Затем вы получите обратный вызов с текущей силой сигнала и будущими обратными вызовами с обновлениями.