1

为什么我们必须设置一个监听器才能在 3g 模式下获取单个当前小区的信号强度?

我们使用 NeghbouringcellInfo 类获得相邻小区的信号强度?

为什么我们不能像这样获得当前小区的信号强度?

4

4 回答 4

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));
            }
        }
    };
于 2012-10-01T13:29:14.070 回答
3

实现是这样的,我们必须实现侦听器来获取当前单元格的信号强度,我已经编写了侦听器并在第一次读取时停止了侦听器,然后保持在变量中。没有其他办法

于 2012-12-04T13:11:06.820 回答
3

我尝试使用“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)

也在这里这里报道。

结论:请注意,许多三星设备无法正常使用此功能! 我不知道有任何解决方法。三星使我们的应用程序不可靠。

于 2013-04-03T06:52:39.407 回答
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 源代码中获取源代码

于 2012-10-01T13:34:11.437 回答