为什么我们必须设置一个监听器才能在3g模式下获得单个当前单元的信号强度?
我们使用NeghbouringcellInfo类得到了相邻细胞的信号强度?
为什么我们不能像这样获得当前细胞的信号强度?
答案 0 :(得分:7)
尝试以下代码:
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));
}
}
};
答案 1 :(得分:3)
实现是这样的,我们必须实现监听器来获取当前单元的信号强度,我已经编写了监听器并在第一次读取时停止了监听器,然后保持在变量中。没有任何其他方式
答案 2 :(得分:3)
我尝试使用“Hazmat”代码,但遗憾的是我的设备无法运行(Samsung S3 mini Android 4.1.2)。似乎三星的一些手机在使用此功能方面存在问题,三星的任何人都不关心。 Also other Samsung models have similar problem:
Samsung Galaxy SI - &gt;没问题
Samsung Galaxy SII - &gt;没有力量也没有刷新
Samsung Galaxy Tab 10.1 - &gt;没有力量也没有刷新
三星Galaxy Note - &gt;没有力量也没有刷新
(Android版本:2.3.3,2.3.4,2.3.5,3.1)
结论: 请注意,很多三星设备无法正常使用此功能! 我不知道有任何解决方法。三星让我们的应用程序不可靠。
答案 3 :(得分:0)
如果我理解得很好,你不想设置一个听众,只要你需要它就能获得信号强度。如果是这样的话就是如何做到这一点:
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
。
是的,此方法由侦听器调用,但它不必。这是一种比不断轮询更有效的做事方式。另一方面,如果您只想在特定时间获得信号强度,只需一次,没有什么可以阻止您从其他地方调用它。
另外,我建议您下载Android发行版。使用“grep”,它提供了很多关于如何使用类,方法等的示例。我从中学到了很多东西。这些例子很好,因为它们是由编写操作系统的人编写的。 此外,您可以获取源代码 Android source code