Как получить силу сигнала LTE в Android?

Я использую новый телефон LTE от Verizon от HTC Thunderbolt. Я не могу найти API для запроса силы сигнала, когда телефон работает на LTE. Вводя полевой тестовый режим ( # # 4636 # # ), я вижу силу сигнала как -98dBm 2 asu. Кто-нибудь знает, какой 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); } } 

    пока

    Чтобы решить этот вопрос, я создал приложение Signal Strength Detector и с исходным кодом GitHub . В моем прошлом опыте некоторые устройства под управлением Android ICS 4.0 и выше имеют метод SignalStrength на SignalStrength который возвращает целое число от 0 до 4, сообщающее о силе сигнала. На некоторых других LTE-устройствах (я не считаю HTC Thunderbolt) существуют некоторые методы, такие как getLteCqi getLteRsrp getLteRsrq и getLteRssnr которые я оставлю вам, чтобы определить, как использовать эти значения для вычисления силы сигнала. Наконец, я обнаружил, что на некоторых устройствах (я думаю, HTC Thunderbolt) уровень сигнала LTE на самом деле сообщается с помощью методов, обозначенных для уровня сигнала GSM! Это безумие, но это правда. Не стесняйтесь загружать детектор силы сигнала и проверять результаты на вашем устройстве и / или изменять код при необходимости.

    В качестве побочной заметки вам нужно будет использовать Reflection для доступа к этим методам, и я оставлю вам, чтобы определить, как наилучшим образом реализовать это. Это довольно просто, но вам нужно сделать много попыток, чтобы определить, присутствует ли этот метод, а иногда setAccessible(true) просто игнорировать любые проблемы с помощью частных методов.

    Надеюсь это поможет!

    Это полная рабочая реализация примерного приложения, которое использует отражение для получения уровня сигнала 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()); } } } 

    Вам необходимо зарегистрировать PhoneStateListener с LISTEN_SIGNAL_STRENGTHS . Затем вы получите обратный вызов с текущей силой сигнала и будущие обратные вызовы с обновлениями.