2013-02-17 6 views
0

3g 네트워크에서 현재 신호 강도와 현재 셀 ID 및 Lac을 내 응용 프로그램에 표시하려고합니다. API-8과 호환되어야하므로 android.telephony에서 SignalStrength 클래스를 사용하고 있습니다. 버튼을 클릭하면 현재 셀의 CID, Lac 및 신호 강도를 표시합니다. 나는 CID와 락을 얻고 있지만, 신호 강도는 항상 코드가 아래에 주어진다 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

글쎄, 오래 전부터 getRSSI() 메소드를 취소하고 listener 및 .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; 
    } 

} 
} 

, 난 그냥 버튼의의 OnClick() 메소드 내부의

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

를 호출 확인하고는 한 번만 값을 표시하지만 나중에 버튼을 누르면 강도를 업데이트하지 않으며 초기 값을 계속 표시합니다.

+0

아마도 초기 구현에서 변수를 업데이트 할 시간이 없었다. ] (http://stackoverflow.com/a/5832912/281545). "값이 정말로 바뀌더라도 힘을 업데이트하지 않고 초기 값을 계속 보여줍니다"-> (http://stackoverflow.com/a/3720676/281545 참조 : 청취자는 신호 변경이 큰 경우에만 호출됩니다.) 편집 : 제발! 대문자로 시작하는 변수 이름을 사용하지 마십시오 (형식은 더 좋지만 불필요한 빈 줄은 피하십시오). EDIT2 : onResume과 onCreate를 모두 등록하는 이유는 무엇입니까? EDIT3 : 당신의 대답을 받아들이십시오 :) –

+0

사실, 큰 변화가있을 때 그것은 자동으로 바뀌었지만 나는 당신이 청취자의 청취를 통제 할 수 있다고 생각하지 않습니다. 그러나 이미 청취자를 시작하고 등록 할 때 버튼을 클릭하면 해당 청취자가 업데이트 한 값에서 최신 값을 가져올 수 있지만 작동 할 것입니다.하지만 처음에는 버튼을 클릭하기 만하면됩니다. 버튼을 누르면, 나중에 방을 바꿨더라도 같은 값을 계속 보여줍니다! 그리고 편집을위한 감사합니다 : 사실 yah 등록을위한 D는 내 아주 초기 코드 중 하나와 같았습니다. –

+0

welcome - maybe check http://stackoverflow.com/questions/3888775/instant-signal-strength/17533439#17533439 - 아마도 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@로 –