如何检测Android网络类型更改事件?

时间:2019-08-20 05:56:11

标签: java android broadcastreceiver

我有以下代码可以在启动时检测当前的网络类型,但是我希望应用程序能够检测到网络类型发生变化的时间,例如从3G变为LTE,从LTE变为3G,从3G变为2G等。 / p>

我为BroadcastReceiver here找到了类NetworkStateReceiver,但是在更改网络时却什么也没显示。

有人可以帮我如何不仅在启动应用程序时显示网络类型,还可以显示/检测网络类型更改的event

我正在尝试Android 6.0.1

package com.example.myapp;

import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;



public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        TelephonyManager teleMan = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        int networkType = teleMan.getNetworkType();

        switch (networkType)
        {
            case 1:     Log.e("TAG", "GPRS");       break;
            case 2:     Log.e("TAG","EDGE");        break;
            case 3:     Log.e("TAG","UMTS");        break;
            case 13:    Log.e("TAG","LTE");             break;
        }

    }

    public class NetworkStateReceiver extends BroadcastReceiver
    {
        public void onReceive(Context context, Intent intent)
        {
            Log.e("app","Network connectivity change");

            if(intent.getExtras() != null)
            {
                NetworkInfo ni = (NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK);
                if(ni != null && ni.getState() == NetworkInfo.State.CONNECTED)
                {
                    Log.e("app", "Network " + ni.getTypeName() + " connected");
                }
            }

            if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE))
            {
                Log.e("app", "There's no network connectivity");
            }
        }
    }
}

我的清单是这样的:

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


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </activity>
    </application>

Thanks for any help.

更新2

我一直在寻找一种在电话更改网络类型(即从2G更改为3G,从3G更改为LTE以及其他类型)时触发事件的方法,但没有成功。

我发现一些类似here的代码,当电话使用Broacaster Receiver从“无互联网连接”变为“ Wifi”或“移动数据”时,可以很好地触发事件ConnectivityManager.TYPE_WIFITYPE_MOBILE并发送Toast消息以显示有关更改的警报。

我了解的是,ConnectivityManager有助于从WIFI变为MOBILE或相反的情况下触发事件,但是当手机处于TYPE_MOBILE状态时,网络类型在2G,3G或LTE之间发生变化,则不会为这些变化生成触发条件。我什至添加了TelephonyManager来处理不同的NETWORK_TYPEs,但是它不起作用。

在发生变化的那一刻,当电话在2G,3G或LTE之间转换时,触发事件需要做什么?

我已经合并了当前答案,但不能达到我的目标。

我正在尝试Android 6。

我到目前为止拥有的Util类是这样:

class NetworkUtil{

public static String getConnectivityStatusString(Context context) {
    String status = null;
    String mobile_status = null;

    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();


    TelephonyManager mTelephonyManager = (TelephonyManager)
            context.getSystemService(Context.TELEPHONY_SERVICE);
    int networkType = mTelephonyManager.getNetworkType();
    switch (networkType) {
        case TelephonyManager.NETWORK_TYPE_GPRS:
        case TelephonyManager.NETWORK_TYPE_EDGE:
            mobile_status = "2G"; break;
        case TelephonyManager.NETWORK_TYPE_UMTS:
        case TelephonyManager.NETWORK_TYPE_HSPA:
            mobile_status = "3G"; break;
        default:
            mobile_status = "Unknown"; break;
    }


    if (activeNetwork != null) {
        if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
            status = "Wifi enabled";
            return status;
        } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE && mobile_status == "2G") {
            status = "2G enabled";
            return status;
        } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE && mobile_status == "3G") {
            status = "3G enabled";
            return status;
        } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE && mobile_status == "Unknown") {
            status = "Mobile unknown enabled";
            return status;
        }
    } else {
        status = "No internet is available";
        return status;
    }

    return status;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

从您的问题中我了解到您需要知道电话的网络状态是什么。在情况5 中,由于wifi和移动数据均已打开,因此部分正确。因此,当您打开移动数据时,请调用包含TelephonyManager的方法。您可以获取移动数据的当前状态。下面的方法是获取网络状态的示例。

  

注意,当您收到启用移动数据的回调时调用此方法

String getMobileDataState(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";
}