web-dev-qa-db-fra.com

Obtenir la force du signal dans Android

Je souhaite obtenir la puissance du signal du périphérique au moment où je lance l'appel de l'API. J'ai cherché sur tous les sujets liés et je n'ai pas encore réussi.

Donc, je voudrais obtenir la force du signal comme

SignalStrength ss = null  ; // some initialization

int n = ss.getGsmSignalStrength();

mais en l'utilisant, il est évident que j'aurai une exception de pointeur nulle puisque j'ai initialisé SignalStrength comme null. Mais je ne sais pas comment initialiser cela.

De plus, je ne veux pas utiliser PhoneStateListener car il ne se déclenche que si le signal change.

Je reçois la force du signal en utilisant le code ci-dessous

TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
CellInfoGsm cellinfogsm = (CellInfoGsm)telephonyManager.getAllCellInfo().get(0);
CellSignalStrengthGsm cellSignalStrengthGsm = cellinfogsm.getCellSignalStrength();
cellSignalStrengthGsm.getDbm();

mais je ne veux pas utiliser CellSignalStrength car il n’est ajouté qu’au niveau 17 de l’API et ne fonctionnera pas avant 17 ans. Je veux que le code fonctionne sur API Niveau 7+.

Ou y a-t-il une autre méthode pour que je puisse obtenir la force du signal au moment de frapper l'appel de l'API?

15
VIGNESH

Définir les variables:

TelephonyManager mTelephonyManager;
MyPhoneStateListener mPhoneStatelistener;   
int mSignalStrength = 0;

Ajoutez ensuite cette classe à votre code:

class MyPhoneStateListener extends PhoneStateListener {

     @Override
     public void onSignalStrengthsChanged(SignalStrength signalStrength) {
         super.onSignalStrengthsChanged(signalStrength);
         mSignalStrength = signalStrength.getGsmSignalStrength();
         mSignalStrength = (2 * mSignalStrength) - 113; // -> dBm           
     }
 }

et dans votre méthode onCreate, utilisez:

mPhoneStatelistener = new MyPhoneStateListener();
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyManager.listen(mPhoneStatelistener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
21
Ingo

Définition globale: 

TelephonyManager telephonyManager;
myPhoneStateListener psListener;
TextView txtSignalStr;

onCreate Méthode: 

@Override
protected void onCreate(final Bundle savedInstanceState) {
 txtSignalStr = (TextView)findViewById(R.id.signalStrength);
 psListener = new myPhoneStateListener();
 telephonyManager = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);
 telephonyManager.listen(psListener,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}

Créer myPhoneStateListener Classe:

public class myPhoneStateListener extends PhoneStateListener {
    public int signalStrengthValue;

    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 {
            signalStrengthValue = signalStrength.getCdmaDbm();
        }
        txtSignalStr.setText("Signal Strength : " + signalStrengthValue);
    }
}
5
reegan29
public class PhoneCustomStateListener extends PhoneStateListener {

    public int signalSupport = 0;

    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);

        signalSupport = signalStrength.getGsmSignalStrength();
        Log.d(getClass().getCanonicalName(), "------ gsm signal --> " + signalSupport);

        if (signalSupport > 30) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Good");


        } else if (signalSupport > 20 && signalSupport < 30) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Avarage");


        } else if (signalSupport < 20 && signalSupport > 3) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Weak");


        } else if (signalSupport < 3) {
            Log.d(getClass().getCanonicalName(), "Signal GSM : Very weak");


        }
    }
}
4
vrbsm

Nous ne devrions pas initialiser signalstrength, mais plutôt utiliser phonelistener et remplacer la méthode onSignalStrengthsChanged (SignalStrength signalStrength).

Par exemple, jetez un oeil à l'extrait de code suivant

class SamplePhoneStateListener extends PhoneStateListener {

        int signalStrength = 0;

        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);
            signalStrength = signalStrength.getGsmSignalStrength();
            //You can check the signal strength value here..
        }

    }

en utilisant un objet TelephonyManager, vous pouvez écouter la classe ci-dessus comme

TelephonyManagerObject.listen(myListener,
            PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
3
Sid

Vous n'instanciez pas SignalStrength (et éventuellement, vous ne pouvez pas). à partir du code de l'application.

Vous devez utiliser PhoneStateListener (sous-classe) et implémenter onSignalStrengthsChanged:

http://developer.Android.com/reference/Android/telephony/PhoneStateListener.html#onSignalStrengthsChanged(Android.telephony.SignalStrength)

Un SignalStrength sera créé pour vous et passé dans votre remplacement.

1
user2579822

Cela a fonctionné pour moi:

Quels sont les services nécessaires:

@SystemService
protected ConnectivityManager connectivityManager;

@SystemService
protected TelephonyManager telephonyManager;

Comment rassembler les métriques:

public void startGatherMetrics() {
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo != null) {
        networkInfoStr = connectivityManager.getActiveNetworkInfo().toString();

        // gather Network Capabilities
        if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.M) {
            Network network = connectivityManager.getActiveNetwork();
            networkInfoStr += "; " + connectivityManager.getNetworkCapabilities(network).toString();
        }
    }
    Log.d("A_NETWORK_INFO", networkInfoStr);

    new Thread(new Runnable() {
        @Override
        public void run() {
            quitLooper = false;
            Looper.prepare();
            telephonyManager.listen(new PhoneStateListener() {
                @Override
                public void onSignalStrengthsChanged(SignalStrength signalStrength) {
                    super.onSignalStrengthsChanged(signalStrength);
                    Log.d("A_NETWORK_METRICS",
                        "Signal Strength (0-4 / dBm):" + getLevel(signalStrength) + " / "
                            + getDbm(signalStrength));

                    if (quitLooper)
                        Looper.myLooper().quit();
                }
            }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

            Looper.loop();
        }
    }).start();

}

public void stop() {
    quitLooper = true;
}

"GetLevel (signalStrength)" et "getDbm (signalStrength)} [" peuvent être trouvés ici .

0