web-dev-qa-db-fra.com

Comment avoir LTE la force du signal dans Android?

J'utilise le nouveau téléphone LTE de Verizon de HTC Thunderbolt. Je ne parviens pas à trouver l’API pour rechercher la force du signal lorsque le combiné est en mode LTE. En entrant dans le mode de test sur le terrain ( # # 4636 # # ), l'intensité du signal est de -98dBm 2 asu. Quelqu'un sait quelle API je pourrais utiliser pour obtenir cette information?

14
Dillon Jay

Attention: cette solution devrait fonctionner pour Android sous API17. Certaines personnes peuvent avoir des problèmes avec une nouvelle API ou une marque de téléphone spécifique (comme Huawei)

Vous devez utiliser ce code. En fait, toutes les informations dont vous avez besoin sont ici:

String ssignal = signalStrength.toString();

String[] parts = ssignal.split(" ");

Le tableau parts[] contiendra alors ces éléments:

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_

Donc, LTEdBm est:

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

au revoir

17
Cocorico

Afin de résoudre cette question, j'ai créé une application appelée Détecteur de puissance du signal et avec le code source sur GitHub . Dans le passé, certains appareils fonctionnant sous Android ICS 4.0 et versions ultérieures utilisent une méthode getLevel sur SignalStrength qui renvoie un entier compris entre 0 et 4 indiquant la force du signal. Sur certains autres appareils LTE (je ne crois pas le HTC Thunderbolt), il existe des méthodes telles que getLteCqigetLteRsrpgetLteRsrq et getLteRssnr que je vous laisserai déterminer comment utiliser ces valeurs pour calculer l'intensité du signal. Enfin, j'ai constaté que sur certains appareils (le HTC Thunderbolt, par exemple), la force du signal LTE est rapportée avec les méthodes étiquetées pour la force du signal GSM! C'est fou, mais c'est vrai. N'hésitez pas à télécharger Signal Strength Detector et à consulter les résultats sur votre appareil et/ou à modifier le code si nécessaire.

En remarque, vous devrez utiliser Reflection pour accéder à ces méthodes. Je vous laisse à nouveau vous demander de quelle manière la mettre en œuvre de manière optimale. C'est assez simple, mais vous devez faire beaucoup d'essais d'interception pour déterminer si la méthode est présente, et parfois setAccessible(true) pour ignorer tout problème avec les méthodes privées.

J'espère que cela t'aides!

13
Tom

Ceci est la mise en œuvre complète d'un exemple d'application qui utilise une réflexion pour obtenir la force du signal 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());
            }
    }
}
7
Sa Qada

Vous devez enregistrer un PhoneStateListener avec LISTEN_SIGNAL_STRENGTHS . Vous obtiendrez alors un rappel avec la force du signal actuel et des rappels futurs avec des mises à jour.

0
Cheryl Simon