Android如何检测2G/3G/4G之间的移动连接子类型变化

Android如何检测2G/3G/4G之间的移动连接子类型变化,android,Android,收听ConnectionManager.CONNECTIVITY\u操作的意图,它似乎仅适用于连接更改(连接/断开连接)或从wifi到移动设备的更改等 但在移动连接中,如果在2G、3G、4G之间切换,无法获得任何意图广播 我希望应用程序在2G连接上禁用,或在3G/4G连接上启用。应用程序将在后台运行。因此,我们需要倾听变化 有可能实现吗 我还想知道系统如何侦听网络类型的更改,并在通知中显示,如上图所示 通过在TelephonyManager中使用getNetworkType方法,我们可以识别其

收听ConnectionManager.CONNECTIVITY\u操作的意图,它似乎仅适用于连接更改(连接/断开连接)或从wifi到移动设备的更改等

但在移动连接中,如果在
2G、3G、4G之间切换,
无法获得任何意图广播

我希望应用程序在
2G连接上禁用
,或在
3G/4G连接上启用
。应用程序将在后台运行。因此,我们需要倾听变化

有可能实现吗


我还想知道系统如何侦听网络类型的更改,并在通知中显示,如上图所示

通过在TelephonyManager中使用getNetworkType方法,我们可以识别其2G或3G

public String getNetworkClass(Context context) {
TelephonyManager mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = mTelephonyManager.getNetworkType();
switch (networkType) {
    case TelephonyManager.NETWORK_TYPE_GPRS:
    case TelephonyManager.NETWORK_TYPE_EDGE:
    case TelephonyManager.NETWORK_TYPE_CDMA:
    case TelephonyManager.NETWORK_TYPE_1xRTT:
    case TelephonyManager.NETWORK_TYPE_IDEN:
         return "2G";
    case TelephonyManager.NETWORK_TYPE_UMTS:
    case TelephonyManager.NETWORK_TYPE_EVDO_0:
    case TelephonyManager.NETWORK_TYPE_EVDO_A:
    case TelephonyManager.NETWORK_TYPE_HSDPA:
    case TelephonyManager.NETWORK_TYPE_HSUPA:
    case TelephonyManager.NETWORK_TYPE_HSPA:
    case TelephonyManager.NETWORK_TYPE_EVDO_B:
    case TelephonyManager.NETWORK_TYPE_EHRPD:
    case TelephonyManager.NETWORK_TYPE_HSPAP:
         return "3G";
    case TelephonyManager.NETWORK_TYPE_LTE:
         return "4G";
    default:
         return "Unknown";
   }
    }
然后使用广播接收机

private class NetworkSwitcher extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        return;
    }
    NetworkInfo networkInfo =
        (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    if (networkInfo.isConnected()) {

            Log.d(TAG, "Network type: " + networkInfo.getTypeName() +
                    " Network subtype: " + networkInfo.getSubtypeName());

     // check your condition here

    } 
    else {
        Log.e(TAG, "Network connection lost");
    }
}
}

有关更多详细信息,请参阅

通过在TelephonyManager中使用getNetworkType方法,我们可以识别其2G或3G

public String getNetworkClass(Context context) {
TelephonyManager mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = mTelephonyManager.getNetworkType();
switch (networkType) {
    case TelephonyManager.NETWORK_TYPE_GPRS:
    case TelephonyManager.NETWORK_TYPE_EDGE:
    case TelephonyManager.NETWORK_TYPE_CDMA:
    case TelephonyManager.NETWORK_TYPE_1xRTT:
    case TelephonyManager.NETWORK_TYPE_IDEN:
         return "2G";
    case TelephonyManager.NETWORK_TYPE_UMTS:
    case TelephonyManager.NETWORK_TYPE_EVDO_0:
    case TelephonyManager.NETWORK_TYPE_EVDO_A:
    case TelephonyManager.NETWORK_TYPE_HSDPA:
    case TelephonyManager.NETWORK_TYPE_HSUPA:
    case TelephonyManager.NETWORK_TYPE_HSPA:
    case TelephonyManager.NETWORK_TYPE_EVDO_B:
    case TelephonyManager.NETWORK_TYPE_EHRPD:
    case TelephonyManager.NETWORK_TYPE_HSPAP:
         return "3G";
    case TelephonyManager.NETWORK_TYPE_LTE:
         return "4G";
    default:
         return "Unknown";
   }
    }
然后使用广播接收机

private class NetworkSwitcher extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        return;
    }
    NetworkInfo networkInfo =
        (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    if (networkInfo.isConnected()) {

            Log.d(TAG, "Network type: " + networkInfo.getTypeName() +
                    " Network subtype: " + networkInfo.getSubtypeName());

     // check your condition here

    } 
    else {
        Log.e(TAG, "Network connection lost");
    }
}
}

有关更多详细信息,请参阅。

还需要侦听phonestatelistener以获取侦听数据连接状态,这将为每次发生的更改报告移动网络类型。

还需要侦听phonestatelistener以获取侦听数据连接状态,这将为每次发生的更改报告移动网络类型。

请参阅是,已经用过了。但我需要在动态发生更改时使用通知方式,而无需自己进行轮询。android右上角的通知是如何实现的?它将显示更改为H、3G或Lte…是的,已侦听ConnectionManager.CONNECTIVITY\u操作,此时获取额外的网络信息并检查子类型。但我现在正在Nexus5上测试Android 6.0.1。移动子类型更改时不会调用它。。。或者子类型未知…是否设置了运行时权限,所有权限都正常。现在我找到了一些解决办法。当收到连接操作时,如果子类型未知,我将获取电话管理器并调用getNetworkType,它将返回正确的子类型。但如果你不能得到意图。什么也做不了。是的,已经用过了。但我需要在动态发生更改时使用通知方式,而无需自己进行轮询。android右上角的通知是如何实现的?它将显示更改为H、3G或Lte…是的,已侦听ConnectionManager.CONNECTIVITY\u操作,此时获取额外的网络信息并检查子类型。但我现在正在Nexus5上测试Android 6.0.1。移动子类型更改时不会调用它。。。或者子类型未知…是否设置了运行时权限,所有权限都正常。现在我找到了一些解决办法。当收到连接操作时,如果子类型未知,我将获取电话管理器并调用getNetworkType,它将返回正确的子类型。但如果你不能得到意图。什么也做不了。