如何在Android中获取手机信号强度?

23

我正在尝试编写一个非常简单的Android应用程序来检查当前基站的信号强度。到目前为止,我只找到了一个称为 getNeighboringCellInfo() 的东西,但我不确定它是否包括当前基站。

如何在Android中获取当前基站的信号强度?

getNeighborCellInfo() 是否能够获取当前基站?根据我所能获得的结果,它似乎并不是。这是我的当前代码:

List<NeighboringCellInfo> n = tm.getNeighboringCellInfo();

//Construct the string
String s = "";
int rss = 0;
int cid = 0;
for (NeighboringCellInfo nci : n)
{
    cid = nci.getCid();
    rss = -113 + 2*nci.getRssi();
    s += "Cell ID: " + Integer.toString(cid) + "     Signal Power (dBm): " + 
            Integer.toString(rss) + "\n";
}

mainText.setText(s);
3个回答

20

创建一个PhoneStateListener并处理onSignalStrengthChanged回调。当您的应用程序初始化时,它应该给您一个初始通知。这是在1.x中。在2.x中,有一个关于此的issue


有没有4.x - 8.x的解决方案? - gtzinos

14

这段代码可能有帮助:

PhoneStateListener phoneStateListener = new PhoneStateListener() {
public void onCallForwardingIndicatorChanged(boolean cfi) {}
public void onCallStateChanged(int state, String incomingNumber) {}
public void onCellLocationChanged(CellLocation location) {}
public void onDataActivity(int direction) {}
public void onDataConnectionStateChanged(int state) {}
public void onMessageWaitingIndicatorChanged(boolean mwi) {}
public void onServiceStateChanged(ServiceState serviceState) {}
public void onSignalStrengthChanged(int asu) {}
};

创建自己的Phone State Listener后,使用位掩码向Telephony Manager注册它以指示要监听的事件,如下代码片段所示:

TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

telephonyManager.listen(phoneStateListener,
PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR |
PhoneStateListener.LISTEN_CALL_STATE |
PhoneStateListener.LISTEN_CELL_LOCATION |
PhoneStateListener.LISTEN_DATA_ACTIVITY |
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE |
PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR |
PhoneStateListener.LISTEN_SERVICE_STATE |
PhoneStateListener.LISTEN_SIGNAL_STRENGTH);

需要将这些内容添加到 AndroidManifest.xml 中:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

1
void onSignalStrengthChanged(int asu)已被弃用,请使用void onSignalStrengthsChanged(SignalStrength signalStrength)代替。 - Sam Sch
@SamSch 如果你使用 onSignalStrengthsChanged 方法,你应该在监听器中使用 PhoneStateListener.LISTEN_SIGNAL_STRENGTHS 的掩码,而不是 PhoneStateListener.LISTEN_SIGNAL_STRENGTH。 - Simone
@Simone,是的,你说得对。很抱歉我错过了那个细节。 - Sam Sch

0

在此输入图片描述以下代码将创建类似图片(Android系统Cell Info)的效果

在运行的活动/片段中,创建如下子类

TextView txtSignalMobile1 = findViewById...;
    class myPhoneStateListener extends PhoneStateListener {
        public int signalStrengthValue;
        public int signalLevel;

        @RequiresApi(api = Build.VERSION_CODES.Q)
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);
            if (signalStrength.isGsm()) {
                if (signalStrength.getGsmSignalStrength() != 99)
                    signalStrengthValue = signalStrength.getGsmSignalStrength() * 2 - 113;
                else{
                    signalStrengthValue = signalStrength.getCellSignalStrengths().get(0).getDbm();
                    signalLevel =signalStrength.getCellSignalStrengths().get(0).getAsuLevel();
                }


            } else {
                signalStrengthValue = signalStrength.getCdmaDbm();
            }
            txtSignalMobile1.setText(signalStrengthValue + "dbm, " + signalLevel + "asu");
        }
    }

可能在onCreate或按钮之后调用其他地方...(使用线程不断更新值的更改)

Thread splashThread2 = new Thread() {
            @Override
            public void run() {
                try {
                    while (!isInterrupted()) {
                        Thread.sleep(1000);

                        requireActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                // update TextView here!
                                int signal2 = NetworkUtils.GetWifiSignal(requireContext());
                                txtSignalWifi.setText(signal2 + "/100");
                            }
                        });
                    }
                } catch (Exception ignore) {
                    // when user exit suddenly
                }
            }
        };
        splashThread2.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接