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?
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);
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);
}
}
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");
}
}
}
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)
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:
Un SignalStrength sera créé pour vous et passé dans votre remplacement.
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 .