【问题标题】:How to monitor network type and get notified if it changes如何监控网络类型并在它发生变化时得到通知
【发布时间】:2014-08-30 11:34:52
【问题描述】:

我正在尝试制作一个应用程序来显示网络类型(2G、3G 或 4G)的状态,这是我通过使用 TelephonyManager 完成的,并在网络类型发生变化时通知用户。 这是我有问题的部分,我如何监控网络类型并在它发生变化时得到通知?

【问题讨论】:

标签: android 3g android-networking telephonymanager


【解决方案1】:

【讨论】:

  • 谢谢,虽然这显示了它是移动数据还是 wifi 或 wimax ......我需要监控不同类型的移动数据(2G、3G 或 4G)有什么想法吗?跨度>
  • 感谢您的努力,编辑部分中的两个链接确定了移动数据的类型,当调用时,我想要的是在更改时得到通知。让我举个例子;假设用户开车旅行,在城市之间或沙漠中,您并不总是有 3G 或 4G 覆盖,用户希望在 3G 或 4G 网络可用时立即收到通知。
【解决方案2】:

您需要这样的东西:(请记住,这仅适用于 Android 4.2+)

    // It Only works on Android 4.2+
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    telephonyManager.listen(new PhoneStateListener(){

        @Override
        public void onCellInfoChanged(List<CellInfo> cellInfo) {
            super.onCellInfoChanged(cellInfo);
            for (CellInfo ci : cellInfo) {
                if (ci instanceof CellInfoGsm) {
                    Log.d("TAG", "This has 2G");
                } else if (ci instanceof CellInfoLte) {
                    Log.d("TAG", "This has 4G");
                } else {
                    Log.d("TAG", "This has 3G");
                }
            }
        }


    }, PhoneStateListener.LISTEN_CELL_INFO);

您还需要清单中的android.permission.READ_PHONE_STATE 权限。

【讨论】:

  • 非常感谢您的时间,伙计,我不断收到>不幸的是,APP 已停止 java.lang.NullPointerException at test.e_rundev.ir.test2。 MyActivity$3.onCellInfoChanged(MyActivity.java:92) at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:456) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop (Looper.java:157) 在 android.app.ActivityThread.main(ActivityThread.java:5293)
  • > at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:1265) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) at dalvik.system.NativeStart.main(Native Method) android.permission.ACCESS_COARSE_LOCATION
  • 您在onCellInfoChanged 方法中得到一个 NullPointerException,我认为这是因为 cellInfo 为空。尝试添加一个 if 语句来检查 cellInfo 是否为空,看看是否能解决您的问题。顺便说一句,你是在设备还是模拟器上运行它?
  • 我在我的 Note 3 设备上运行它,该设备目前有 2G - 边缘覆盖使用 TelephonyManager 的 getNetworkType 方法我可以获得“NETWORK_TYPE_EDGE”
  • 我可以在几个小时内把我的设备带上车,到时会通知你。但是对于 cellInfo 无效的 if 语句,似乎该应用程序应该可以工作。
【解决方案3】:

过了一会儿,这里是一个工作代码:

onCreate 下:

    TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    TelephonyMgr.listen(new TeleListener(),
            PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

作为一个班级:

public class TeleListener extends PhoneStateListener {  
    public void onDataConnectionStateChanged (int state, int networkType){
        super.onDataConnectionStateChanged(state, networkType);  
   //Whatever you wanna do  
      }  
}

onDataConnectionStateChanged(int state, int networkType) 方法在网络类型(2G、3G、4G)改变或连接状态(连接、断开等)改变时触发

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 2012-04-13
    • 1970-01-01
    • 2017-10-18
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多