为什么我们必须设置一个监听器才能在 3g 模式下获取单个当前小区的信号强度?
我们使用 NeghbouringcellInfo 类获得相邻小区的信号强度?
为什么我们不能像这样获得当前小区的信号强度?
为什么我们必须设置一个监听器才能在 3g 模式下获取单个当前小区的信号强度?
我们使用 NeghbouringcellInfo 类获得相邻小区的信号强度?
为什么我们不能像这样获得当前小区的信号强度?
试试下面的代码:
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)。似乎三星的某些手机在此功能方面存在问题,而三星没有人关心。其他三星机型也有类似问题:
三星 Galaxy SI -> 没问题
三星 Galaxy SII -> 没有实力也没有刷新
三星 Galaxy Tab 10.1 -> 无力无刷新
三星 Galaxy Note -> 没有力气也没有刷新
(安卓版本:2.3.3、2.3.4、2.3.5、3.1)
结论:请注意,许多三星设备无法正常使用此功能! 我不知道有任何解决方法。三星使我们的应用程序不可靠。
如果我理解得很好,您不想设置监听器,而只是在需要时获取信号强度。如果是这种情况,这里是如何做到的:
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 源代码中获取源代码