2013-02-17 5 views
0

Я пытаюсь показать текущую силу сигнала и текущий идентификатор ячейки и Lac в своем приложении для сети 3g. Поскольку он должен быть совместим с API-8, я использую класс SignalStrength из android.telephony. Когда я нажимаю кнопку, на данный момент я хочу, чтобы она показывала CID, Lac и уровень сигнала текущей ячейки. Я получаю ИДС и ЛАК, но сила сигнала всегда показывает 0. Код приведен ниже:Мой PhoneStateListener не вызывается для отображения уровня сигнала

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); 
    } 
} 

Я проверил много примеров в Интернете, и я думаю, что мой код хорошо. Но когда я проверил его в режиме отладки, я вижу, что когда я нажимаю кнопку, программа никогда не переходит в onSignalStrengthsChanged. Есть что-то, чего я не вижу?

+0

Вы регистрируете своего слушателя? у вас есть разрешения? если да, попробуйте сделать «singalStrengths» статическим - или даже лучше сохраните его в настройках. Даже в этом случае он не будет показывать последний сигнал - см. Http://stackoverflow.com/questions/3888775/instant-signal-strength –

+0

well Это было давно, я помню, когда я отменил метод getRSSI() и поставил слушателя и .getStrength() внутри OnCreate(), он работал нормально. Но, честно говоря, еще не знаю, почему это сработало нормально. –

+0

Опубликовать в качестве ответа - я не знаю, почему это сработало - вы уверены, что это было единственное изменение, которое вы сделали? –

ответ

0

Ну, вот как я попытался позже, и все получилось отлично. Я должен был сделать CurStrgth.setText() независимым от Button и внутри PhoneStateListener и вызвал слушателя из метода OnCreate(). И он отлично работает, обновляет CurStrgth TextView всякий раз, когда он получает изменение в силе сигнала. Мой код приведен ниже:

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; 
    } 

} 
} 

Теперь я проверил только вызов

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

внутри метода OnClick() для кнопки, и это показывает только значение один раз, но если я нажимаю кнопку позже Он никогда не обновляет Силу и продолжает показывать начальное значение.

+0

Возможно, в вашей первоначальной реализации у него не было времени обновить переменную - см. [Здесь ] (http://stackoverflow.com/a/5832912/281545). «Он никогда не обновляет Силу и не показывает начальное значение» -> даже когда значение действительно меняется? (см. http://stackoverflow.com/a/3720676/281545: слушатель вызывается только при больших изменениях сигнала). EDIT: Пожалуйста! не используйте имена переменных, начинающиеся с заглавной буквы (ваше форматирование лучше - но избегайте ненужных пустых строк). EDIT2: почему вы регистрируете как onResume, так и onCreate? EDIT3: примите ваш ответ :) –

+0

На самом деле, он изменил авто, когда произошли большие изменения, и все же я не думаю, что это возможно, что вы можете контролировать прослушивание слушателя. Но я планировал, что, когда я уже инициировал Listener и зарегистрировал его, если бы я мог просто нажатием кнопки получить последнее значение из обновленного значения Listeners, это сработает, но кажется, что я просто работаю в первый раз, когда я нажимаю кнопку , после этого он продолжает показывать одно и то же значение. Даже если я сменил свою комнату! и спасибо за изменения: D для регистрации на самом деле yah это было как один из моих очень ранних кодов. –

+0

приветствуется - возможно, проверьте http://stackoverflow.com/questions/3888775/instant-signal-strength/17533439#17533439 - возможно дает вам более свежий сигнал - добавьте @Mr_and_Mrs_D (пример), если вы хотите, чтобы пользователи были уведомлены о ваших комментариях - я просто случайно увидел это –