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?
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
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 getLteCqi
getLteRsrp
getLteRsrq
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!
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());
}
}
}
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.