如何在安卓工作室中检测活动的互联网连接



我的应用程序基于webview。我添加了带有重试按钮的布局,没有互联网活动。如果wifi或移动数据关闭,则应用程序会显示带有重试按钮的布局。但是,如果wifi或移动数据是在没有活动互联网连接的情况下连接的,那么它不会显示布局,而是显示错误页面。我应该做些什么来检测活跃的互联网连接并克服这个问题?

我的代码:

public void internetcheck() {
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobiledata = connectivityManager.getNetworkInfo(connectivityManager.TYPE_MOBILE);
NetworkInfo wifi = connectivityManager.getNetworkInfo(connectivityManager.TYPE_WIFI);

if (mobiledata.isConnected()) {
myWebView.setVisibility(View.VISIBLE);
relativeLayout.setVisibility(View.GONE);
mAdView.setVisibility(View.VISIBLE);
myWebView.reload();

} else if (wifi.isConnected()) {
myWebView.setVisibility(View.VISIBLE);
relativeLayout.setVisibility(View.GONE);
mAdView.setVisibility(View.VISIBLE);
myWebView.reload();
} else {
myWebView.setVisibility(View.GONE);
relativeLayout.setVisibility(View.VISIBLE);
mAdView.setVisibility(View.GONE);

}

}

可能是这个线程的重复。

现在似乎没有合适的方法来检查api<23.

使用Utils类isInternetAvailable()函数获取设备的Internet状态。它自动支持不推荐使用的isInternetAvailableLegacy()用于低于安卓M的安卓版本。

import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.Build
import androidx.annotation.RequiresApi
class Utils constructor(context: Context,
private val logger: Logger) {
enum class NETWORK_TYPE {
WIFI,
CELLULAR,
ETHERNET
}
private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
@SuppressLint("MissingPermission")
fun isInternetAvailable(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val transportType = getTransportType()
if (transportType != null) true
else isInternetAvailableLegacy()
} else isInternetAvailableLegacy()
}
@Suppress("DEPRECATION")
@SuppressLint("MissingPermission")
private fun isInternetAvailableLegacy(): Boolean {
try {
val activeNetworkInfo = connectivityManager.activeNetworkInfo
if (activeNetworkInfo != null && activeNetworkInfo.isConnected) {
return true
}
} catch (e: Exception) {
// TODO Handle Exception
}
return false
}
@RequiresApi(Build.VERSION_CODES.M)
@SuppressLint("MissingPermission")
private fun getTransportType(): NETWORK_TYPE? {
val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
capabilities?.let {
return when {
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> NETWORK_TYPE.CELLULAR
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> NETWORK_TYPE.WIFI
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> NETWORK_TYPE.ETHERNET
else -> null
}
}
return null
}
}

添加此方法来检查是否有工作的互联网连接-

public boolean isInternetAvailable() {
try {
InetAddress ipAddr = InetAddress.getByName("google.com"); 
//You can replace it with your name
return !ipAddr.equals("");
} catch (Exception e) {
return false;
}
}

编辑

在活动/片段中添加上述方法,如下所示-

活动中

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// you other code here
}
private boolean isInternetAvailable() {
// past above methode body here
}
}

并且您的internetcheck()方法将如下-

public void internetcheck() {
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobiledata = connectivityManager.getNetworkInfo(connectivityManager.TYPE_MOBILE);
NetworkInfo wifi = connectivityManager.getNetworkInfo(connectivityManager.TYPE_WIFI);

if (mobiledata.isConnected() || wifi.isConnected()) {
if(isInternetAvailable()){
myWebView.setVisibility(View.VISIBLE);
relativeLayout.setVisibility(View.GONE);
mAdView.setVisibility(View.VISIBLE);
myWebView.reload();
}
//you can put another else in case there is no active internet
} 
else {
myWebView.setVisibility(View.GONE);
relativeLayout.setVisibility(View.VISIBLE);
mAdView.setVisibility(View.GONE);
}             
}

快乐编码!

相关内容

最新更新