Как получить силу сигнала LTE в Android? - PullRequest
15 голосов
/ 05 апреля 2011

Я использую новый телефон LTE от Verizon от HTC Thunderbolt.Я не могу найти API для запроса уровня сигнала, когда телефон находится на LTE.Входя в режим полевого тестирования ( # # 4636 # # ), я вижу уровень сигнала как -98 дБм 2 asu.Кто-нибудь знает, какой API я мог бы использовать, чтобы получить эту информацию?

Ответы [ 4 ]

17 голосов
/ 06 мая 2013

Предупреждение: это решение должно работать на Android ниже API17.У некоторых людей могут возникнуть проблемы с новым API или конкретным брендом телефона (например, Huawei)

Вам необходимо использовать этот код.Фактически вся необходимая информация находится здесь:

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);
                }
}

пока

13 голосов
/ 09 января 2012

Для решения этого вопроса я создал приложение под названием 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), просто чтобы игнорировать любые проблемы с закрытыми методами.

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

8 голосов
/ 29 июля 2015

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

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

...