10 votes

Gamme pour signalStrength en dbm pour les dispositifs CDMA

Je vérifie l'intensité du signal pour les appareils CDMA. Quelqu'un peut-il préciser la plage signalStrength.getCdmaDbm() les retours Le plus bas est -120 mais pour un signal de pleine puissance, quelle est la valeur ? La valeur la plus élevée que j'ai obtenue est -52.

16voto

JPM Points 3409

Je ne sais pas si c'est ce que vous cherchez, mais après avoir jeté un coup d'œil au fichier SignalStrength.java dans les sources d'Android, j'ai remarqué un bout de code qui a plusieurs niveaux pour les niveaux cdma dbm et ecio.

DBM 
level 4 >= -75
level 3 >= -85
level 2 >= -95
level 1 >= -100

Ecio 
level 4 >= -90
level 3 >= -110
level 2 >= -130
level 1 >= -150

et le niveau est le plus bas des deux

actualLevel = (levelDbm < levelEcio) ? levelDbm : levelEcio;

mais j'ai remarqué qu'il n'y a pas de corrélation avec les barres réelles affichées dans la notification. Si vous êtes en 3G, ce niveau est ignoré et c'est le rapport signal/bruit qui est utilisé.

signalStrength.getEvdoSnr() // value is 0 to 8 so divide by two to get the bars

si les données passent de 3G à 1x, utiliser le niveau réel.

Voici mon code pour afficher le nombre de barres.

   public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        if (signalStrength.isGsm()) {
            if (signalStrength.getGsmSignalStrength() != 99)
                signalStrengthValue = signalStrength.getGsmSignalStrength() * 2 - 113;
            else
                signalStrengthValue = signalStrength.getGsmSignalStrength();
        } else {
            final int snr = signalStrength.getEvdoSnr();
            final int cdmaDbm = signalStrength.getCdmaDbm();
            final int cdmaEcio = signalStrength.getCdmaEcio();
            int levelDbm;
            int levelEcio;
            int level = 0;

            if (snr == -1) {
                if (cdmaDbm >= -75) levelDbm = 4;
                else if (cdmaDbm >= -85) levelDbm = 3;
                else if (cdmaDbm >= -95) levelDbm = 2;
                else if (cdmaDbm >= -100) levelDbm = 1;
                else levelDbm = 0;

                // Ec/Io are in dB*10
                if (cdmaEcio >= -90) levelEcio = 4;
                else if (cdmaEcio >= -110) levelEcio = 3;
                else if (cdmaEcio >= -130) levelEcio = 2;
                else if (cdmaEcio >= -150) levelEcio = 1;
                else levelEcio = 0;

                level = (levelDbm < levelEcio) ? levelDbm : levelEcio;
            } else {
                if (snr == 7 || snr == 8) level =4;
                else if (snr == 5 || snr == 6 ) level =3;
                else if (snr == 3 || snr == 4) level = 2;
                else if (snr ==1 || snr ==2) level =1;

            }

            text.setText("Bars= " + level);

        }
    }

dans la méthode de création, utiliser ce qui suit, et s'assurer que le manifeste utilise READ_PHONE_STATE.

    TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    AndroidPhoneStateListener phoneStateListener = new AndroidPhoneStateListener(text);
    telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X