【问题标题】:How detect networktype (2G/3G/LTE) when connected to WiFi连接到 WiFi 时如何检测网络类型 (2G/3G/LTE)
【发布时间】:2018-07-12 11:11:35
【问题描述】:

我目前正在编写一个应用程序,我想检测 Android 设备当前连接到哪种网络类型(2G、3G 或 LTE)。我尝试过使用以下解决方案:

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
tm.getNetworkType()

和连接管理器:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getSubtype() 

这两种方法都可以在没有 WiFi 连接的情况下正常工作,但如果连接到 WiFi TelephonyManager 返回 https://developer.android.com/reference/android/telephony/TelephonyManager#NETWORK_TYPE_IWLAN 并且 ConnectivityManager 返回 0(未知)。

有没有什么方法可以查出手机是连接到 2G、3G 还是 LTE,即使它连接到 WiFi 网络?

【问题讨论】:

标签: android


【解决方案1】:

问题在于,在 API 版本 24 和转发中,getNetworkType() 被分成了两个单独的方法:

getDataNetworkType()

和

getVoiceNetworkType()

我在我的代码中添加了一个检查,以检查返回的类型是否为 IWLAN,如果是,请改用 getVoiceNetworkType()。

if (tm.getNetworkType() != 18)
    return tm.getNetworkType();
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) 
    return tm.getVoiceNetworkType();
else 
    return -1;

【讨论】:

    【解决方案2】:

    您可以尝试使用来自ConnectivityManager 的getAllNetworks(),它会跟踪所有活动网络。

    请看这里: https://developer.android.com/reference/android/net/ConnectivityManager#getAllNetworks()

    您可以使用getNetworkInfo()检索有关某个返回网络的更多详细信息

    请看这里: https://developer.android.com/reference/android/net/ConnectivityManager#getNetworkInfo(android.net.Network)

    【讨论】:

    • 感谢您的回复,很遗憾 getAllNetworks() 仅返回一个 WIFI 类型的网络实例,即使我也连接到移动网络。
    【解决方案3】:

    调用此方法

    public void checkNetworkType(){
            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    
            if ((tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSDPA)) {
    
                Toast.makeText(this, "3G network type", Toast.LENGTH_LONG).show();
    
    
            } else if ((tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSPAP)) {
                Toast.makeText(this, "4G network type", Toast.LENGTH_LONG).show();
    
            } else if ((tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_GPRS)) {
                Toast.makeText(this, "GPRS network type", Toast.LENGTH_LONG).show();
    
            } else if ((tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_EDGE)) {
                Toast.makeText(this, "2G network type", Toast.LENGTH_LONG).show();
    
            }
        }
    

    【讨论】:

    • 不幸的是,如果我当时连接在 WIFI 上,getNetworkType 返回 TYPE_IWLAN,此方法不起作用。
    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多