2013-02-17 1 views
0

J'essaie de montrer la force actuelle du signal et l'ID de la cellule actuelle et Lac dans mon application pour le réseau 3g. Comme il doit être compatible avec API-8, j'utilise la classe SignalStrength de android.telephony. Quand je clique sur un bouton, pour l'instant je veux qu'il montre le CID, Lac et la force du signal de la cellule actuelle. Je reçois le CID et le lac, mais la force du signal montre toujours 0. Le code est donné ci-dessous:Mon PhoneStateListener n'est pas appelé pour montrer la force du signal

public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.bShowCell: 
     GsmCellLocation location; 
     String cellID = ""; 
     String lac = ""; 
     Context context = (Context) getApplicationContext(); 
     TelephonyManager tm = (TelephonyManager) context 
       .getSystemService(Context.TELEPHONY_SERVICE); 
     location = (GsmCellLocation) tm.getCellLocation(); 
     cellID = String.valueOf(location.getCid()); 
     lac = String.valueOf(location.getLac()); 
     CurCell.setText(cellID); 
     CellLac.setText(lac); 
     CurStrgth.setText(getRSSI()); 
    } 
} 

public String getRSSI() { 
    MyListener = new MyPhoneStateListener(); 
    Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 
    String strength = MyListener.getStrength(); 
    return strength; 
} 

class MyPhoneStateListener extends PhoneStateListener { 

    public int singalStrengths; 

    @Override 
    public void onSignalStrengthsChanged(SignalStrength signalStrength) { 
     super.onSignalStrengthsChanged(signalStrength); 
     int asu = signalStrength.getGsmSignalStrength(); 
     singalStrengths = -113 + 2 * asu; 
    } 

    public String getStrength() { 
     return String.valueOf(singalStrengths); 
    } 
} 

J'ai vérifié beaucoup d'exemples en ligne et je pense que mon code est correct. Mais quand je l'ai vérifié en mode debug, je vois que quand je clique sur le bouton, le programme ne va jamais dans onSignalStrengthsChanged. Y a-t-il quelque chose qui me manque?

+0

est-ce que vous enregistrez votre auditeur? avez-vous les permissions? Si oui, essayez de rendre statique 'singalStrengths' - ou mieux encore, stockez-le dans les préférences. Même ainsi, il ne sera pas afficher le dernier signal - voir http://stackoverflow.com/questions/3888775/instant-signal-strength –

+0

Eh bien, il y a longtemps, je me souviens comme quand j'ai annulé la méthode getRSSI() et mettre le écouteur et .getStrength() directement dans OnCreate(), cela a bien fonctionné. Mais pour être honnête, je ne sais toujours pas pourquoi cela a bien fonctionné. –

+0

Postez-le comme une réponse - je ne sais pas pourquoi cela a fonctionné - êtes-vous sûr que c'était le seul changement que vous avez fait? –

Répondre

0

Eh bien, voici comment j'ai essayé plus tard et ça a bien fonctionné. J'ai dû rendre le CurStrgth.setText() indépendant du bouton et à l'intérieur du PhoneStateListener et appelé l'écouteur de la méthode OnCreate(). Et cela fonctionne bien, met à jour le CurStrgth TextView chaque fois qu'il change la force du signal. Mon code est donné ci-dessous:

public class MainActivity extends Activity implements OnClickListener { 


TextView CurStrgth; 
MyPhoneStateListener MyListener; 
TelephonyManager Tel; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    CurStrgth = (TextView) findViewById(R.id.tvCurCellStrength); 

    MyListener = new MyPhoneStateListener(); 

    Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 


} 


@Override 
protected void onPause() { 
    super.onPause(); 
    Tel.listen(MyListener, PhoneStateListener.LISTEN_NONE); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 
} 

private class MyPhoneStateListener extends PhoneStateListener { 
    String gsmStrength = ""; 

    @Override 
    public void onSignalStrengthsChanged(SignalStrength signalStrength) { 
     super.onSignalStrengthsChanged(signalStrength); 
      gsmStrength = String 
       .valueOf(signalStrength.getGsmSignalStrength() * 2 - 113); 
     CurStrgth.setText(MyListener.getStrength() + "dBm"); 
    } 

    public String getStrength() { 
     return gsmStrength; 
    } 

} 
} 

Maintenant, je VISUALISES simplement appeler la

CurStrgth.setText(MyListener.getStrength() + "dBm"); 

dans la méthode OnClick() pour un bouton et il montre que la valeur une fois, mais si j'appuie sur le bouton plus tard Il ne met jamais à jour la force et continue d'afficher la valeur initiale.

+0

Probablement dans votre implémentation initiale, il n'a pas eu le temps de mettre à jour la variable - voir [ici ] (http://stackoverflow.com/a/5832912/281545). "Il ne met jamais à jour la Force et continue d'afficher la valeur initiale" -> même lorsque la valeur change vraiment? (voir http://stackoverflow.com/a/3720676/281545: l'écouteur est seulement appelé dans les changements de grand signal). EDIT: S'il vous plaît! N'utilisez pas de noms de variables commençant par une majuscule (votre formatage est préférable - mais évitez les lignes vides inutiles). EDIT2: pourquoi vous enregistrez à la fois onResume et onCreate? EDIT3: Acceptez votre réponse :) –

+0

En fait, oui, ça a changé automatiquement quand il y a un gros changement et pourtant je ne pense pas qu'il soit possible que vous puissiez contrôler l'écoute de l'auditeur. Mais je prévoyais que quand j'ai déjà initié l'écouteur et l'ai enregistré, si je pouvais juste avec un clic de souris obtenir la dernière valeur de cette valeur mise à jour par les auditeurs, cela fonctionnerait, mais il semble que ça marche pour la première fois. bouton, après, il continue à montrer la même valeur même si j'ai changé ma chambre! et merci pour les modifications: D pour l'enregistrement effectivement yah c'était comme un de mes premiers codes .. –

+0

bienvenue - peut-être vérifier http://stackoverflow.com/questions/3888775/instant-signal-strength/17533439#17533439 - peut-être vous donne un signal plus à jour - ajoutez @Mr_and_Mrs_D (exemple) si vous voulez que les utilisateurs soient avertis de vos commentaires - je viens de le voir accidentellement –

Questions connexes