3gモードで単一電流セルの信号強度を取得するためにリスナーを設定する必要があるのはなぜですか?
NeghbouringcellInfoクラスを使用してneighbouringcellの信号強度を取得しますか?
なぜそのような現在のセルの信号強度を取得できないのですか?
3gモードで単一電流セルの信号強度を取得するためにリスナーを設定する必要があるのはなぜですか?
NeghbouringcellInfoクラスを使用してneighbouringcellの信号強度を取得しますか?
なぜそのような現在のセルの信号強度を取得できないのですか?
次のコードを試してください。
ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
boolean is3g = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
if (is3g) {
myListener = new MyPhoneStateListener();
TelephonyManager telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(myListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
private class MyPhoneStateListener extends PhoneStateListener {
public int singalStenths = 0;
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength){
super.onSignalStrengthsChanged(signalStrength);
int singalStrength = signalStrength.getGsmSignalStrength();
singalStenths = signalStrength.getGsmSignalStrength();
System.out.println("----- gsm strength" + singalStrength );
System.out.println("----- gsm strength" + singalStenths );
if (singalStenths > 30) {
signalstrength.setText("Signal Str : Good");
signalstrength.setTextColor(getResources().getColor(R.color.good));
}
else if(singalStenths > 20 && singalStenths < 30) {
signalstrength.setText("Signal Str : Average");
signalstrength.setTextColor(getResources().getColor(R.color.average));
}
else if(singalStenths < 20) {
signalstrength.setText("Signal Str : Weak");
signalstrength.setTextColor(getResources().getColor(R.color.weak));
}
}
};
実装は、現在のセルの信号強度を取得するためにリスナーを実装する必要があるようなものです。リスナーを作成し、最初の読み取りでリスナーを停止してから、変数に保持しました。他の方法はありません
「Hazmat」コードを使用しようとしましたが、残念ながら私のデバイス(Samsung S3 mini Android 4.1.2)では動作しません。サムスンの一部の電話はこの機能に問題があるようで、サムスンの誰も気にしません。また、他のサムスンモデルにも同様の問題があります:
サムスンギャラクシーSI->問題ありません
サムスンギャラクシーSII->強度もリフレッシュもありません
サムスンギャラクシータブ10.1->強度もリフレッシュもありません
サムスンギャラクシーノート->強度もリフレッシュもありません
(Androidバージョン:2.3.3、2.3.4、2.3.5、3.1)
結論:多くのSamsungデバイスがこの機能で正しく動作しないことに注意してください! 私はそれの回避策を知りません。サムスンは私たちのアプリを信頼できないものにします。
私がよく理解しているなら、あなたはリスナーを設定したくはありませんが、必要なときにいつでも信号強度を取得するだけです。それが事実であるならば、ここにそれをする方法があります:
android.telephony.SignalStrength
あなたは3GまたはCDMAまたはあなたが接続しているどんなタイプのセルも手に入れるでしょう。
それが役に立てば幸い。
--------コメントの後に編集--------------
リスナーは、常にポーリングしなくても、関心のあるものに変更があったことを通知するための優れた方法です。それははるかに効率的です。
これは私がAndroidのソースコードから取った例です。
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
String updateMsg = "cdma dBM=" + signalStrength.getCdmaDbm();
mTrackerData.writeEntry(SIGNAL_PROVIDER_TAG, updateMsg);
} else if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
String updateMsg = "gsm signal=" + signalStrength.getGsmSignalStrength();
mTrackerData.writeEntry(SIGNAL_PROVIDER_TAG, updateMsg);
}
}
これはから取得されframeworks/base/tests/LocationTracker/src/com/android/locationtracker/TrackerService.java
ます。はい、このメソッドはリスナーによって呼び出されますが、呼び出す必要はありません。これは、常にポーリングするよりもはるかに効率的な方法です。一方、特定の時間、つまり1ショットだけの信号強度が必要な場合は、他の場所から呼び出すことを妨げるものは何もありません。
また、Androidディストリビューションをダウンロードすることをお勧めします。「grep」を使用すると、クラスやメソッドなどがどのように使用されるかについて多くの例が示されます。私はそれから多くを学んでいます。これらの例は、OSを作成した人によってコーディングされているため、優れています。また、 Androidのソースコードでソースコードを入手でき ます