我有以下代码可以在启动时检测当前的网络类型,但是我希望应用程序能够检测到网络类型发生变化的时间,例如从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_WIFI
和TYPE_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;
}
感谢您的帮助。
答案 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";
}