あなたの質問に答えるのが遅くなるかもしれませんが、あなたがまだ答えを探しているなら、ここにあります:
a) はい、PhoneStateListener を使用して onSignalStrengthsChanged を上書きする必要があります。私の知る限り、これが GSM の現在のセルの信号強度を取得する唯一の方法です。リスナーは大きな信号強度の変化でのみ呼び出されるため、自分でリスナーを制御することはできません。リスナーは、呼び出されると自動的に更新またはトーストを作成します。そのため、リスナーを宣言して、onCreate() でリッスンするように依頼することをお勧めします。
b) リスナーの外部から RSSI 値にアクセスするのはそれほど難しくありません。値を変数に格納し、呼び出されたときに値を返す getRSSI() などのメソッドを作成するだけです。以下に例を示します。
public class GsmRSSI extends Activity{
MyPhoneStateListener MyListener;
TelephonyManager Tel;
ArrayList<String> signalStrength = new ArrayList<String>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyListener = new MyPhoneStateListener();
Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
timer.schedule(new TimerTask() {
public void run() {
String rssi = MyListener.getStrength();
if(!rssi.equals(""))
signalStrength.add(rssi);
}
}, 0, 5000);//it will add the rssi value after every 5000ms
}
private class MyPhoneStateListener extends PhoneStateListener {
String gsmStrength = "";
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
gsmStrength = String.valueOf(signalStrength.getGsmSignalStrength()* 2 - 113);
}
public String getStrength() {
return gsmStrength;
}
}
}
これでうまくいくはずです。ただし、rssi に大きな変化があった場合にのみリスナーが呼び出されるため、最初はしばらくの間 rssi 値を取得できない場合があります。