如何获取安卓手机的信号强度

7

我刚开始学习 Android 开发,想知道如何获取用户的信号强度。下面的代码可以获得 GSM 网络的 Dbm:

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

// Get GSM Signal Strength (Dbm)
CellInfoGsm GSM = (CellInfoGsm)telephonyManager.getAllCellInfo().get(0);
CellSignalStrengthGsm cellSignalStrengthGsm = GSM.getCellSignalStrength();
signalStrength = cellSignalStrengthGsm.getDbm();

然而,我希望能够获取任何类型网络的信号强度。不管是GSM、LTE、CDMA还是WCDMA网络。我已经查看了电信文档,但是我不知道如何操作。我尝试使用与上面相同的代码,只是用Lte代替Gsm,但这导致我的模拟器崩溃。
任何帮助都将不胜感激。
更新并添加了下面答案中的监听器,但现在只要运行app就会崩溃。这是日志文件。
05-26 11:25:21.140: D/AndroidRuntime(921): Shutting down VM
05-26 11:25:21.140: W/dalvikvm(921): threadid=1: thread exiting with uncaught exception (group=0xb3aecba8)
05-26 11:25:21.170: E/AndroidRuntime(921): FATAL EXCEPTION: main
05-26 11:25:21.170: E/AndroidRuntime(921): Process: com.example.androidcellinfo, PID: 921
05-26 11:25:21.170: E/AndroidRuntime(921): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidcellinfo/com.example.androidcellinfo.MainActivity}: java.lang.NullPointerException
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.os.Handler.dispatchMessage(Handler.java:102)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.os.Looper.loop(Looper.java:136)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.ActivityThread.main(ActivityThread.java:5017)
05-26 11:25:21.170: E/AndroidRuntime(921):  at java.lang.reflect.Method.invokeNative(Native Method)
05-26 11:25:21.170: E/AndroidRuntime(921):  at java.lang.reflect.Method.invoke(Method.java:515)
05-26 11:25:21.170: E/AndroidRuntime(921):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-26 11:25:21.170: E/AndroidRuntime(921):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-26 11:25:21.170: E/AndroidRuntime(921):  at dalvik.system.NativeStart.main(Native Method)
05-26 11:25:21.170: E/AndroidRuntime(921): Caused by: java.lang.NullPointerException
05-26 11:25:21.170: E/AndroidRuntime(921):  at com.example.androidcellinfo.CellInfo.<init>(CellInfo.java:74)
05-26 11:25:21.170: E/AndroidRuntime(921):  at com.example.androidcellinfo.MainActivity.onCreate(MainActivity.java:28)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.Activity.performCreate(Activity.java:5231)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-26 11:25:21.170: E/AndroidRuntime(921):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-26 11:25:21.170: E/AndroidRuntime(921):  ... 11 more
05-26 11:25:25.090: I/Process(921): Sending signal. PID: 921 SIG: 9

以下是第74行(CellInfo)的代码: Code Snippet 1 以下是第28行(MainActivity)的代码: Code Snippet 2
1个回答

0
重复的问题吗? 如何在Android中获取手机信号强度? Android:如何获取所有可用网络运营商的GSM信号强度? 在Android中检索GSM信号强度

无论如何,请查看上面那些链接或以下这些参考资料:

http://developer.android.com/reference/android/telephony/SignalStrength.html

http://www.firstdroid.com/2010/05/12/get-provider-gsm-signal-strength/


如果您懒得检查,这个似乎可以工作(没有检查过):

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) {}
    //Deprecated
    //public void onSignalStrengthChanged(int asu) 
    public void onSignalStrengthChanged (SignalStrength signalStrength)
    {
         //Do your thing
    }
};

一旦创建了自己的PhoneStateListener,使用位掩码将其注册到Telephony Manager,以指示您要侦听的事件,如以下代码片段所示:

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);

如何获取所有可用网络列表:

Android:如何获取所有可用网络运营商的GSM信号强度


抱歉,我刚开始开发Android。我应该如何获取所有网络的Dbm信息?我知道可以创建一个监听器来检测它何时更改,但我真正需要的是一种获取Lte、Cdma和Wcdma网络的Dbm的方法。 - RockPaperScissors
获取所有可用网络和信号强度对您没有帮助吗? - Fernando Carvalhosa
PhoneStateListener phoneStateListener = new PhoneStateListener() { public void onSignalStrengthChanged(int asu) { System.out.println("手机状态" + asu); setSignalLevel(asu); }private void setSignalLevel(int level){ int sLevel = (int) ((level / 31.0) * 100); System.out.println("信号强度 " +sLevel); } }; 这是我能够得到的,但我的应用程序在运行此代码时崩溃了。 - RockPaperScissors
你能和我们分享一下错误日志吗? - Fernando Carvalhosa
1
好的,我已经添加了你要求的代码。顺便说一下,非常感谢你在这方面的帮助。 - RockPaperScissors
显示剩余4条评论

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