当前位置: 首页 > 知识库问答 >
问题:

如何在android Studio中检测活动的互联网连接

郭皓
2023-03-14

我的应用程序基于 Web 视图。我添加了带有重试按钮的布局,没有互联网活动。如果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);


        }


    }

共有3个答案

乌灿
2023-03-14

添加此方法以检查是否有可用的internet连接-

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;
    }
}

编辑

在Activity/Fragment中添加上述方法,如下所示-

在活动中

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       // you other code here
    }

    private boolean isInternetAvailable() {
    // past above methode body here
    }
}

您的interneteck()方法将如下所示-

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);
        }             
}

快乐编码!

龚镜
2023-03-14

使用 Utils 类 isInternetAvailable() 函数获取设备的 Internet 状态。它自动支持已弃用的 isInternetAvailableLegacy() 用法,适用于低于 Android M 的 Android 版本。

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
    }
}
杨超
2023-03-14

也许是这个线程的副本。

似乎现在没有合适的方法来检查api的UI线程

 类似资料:
  • 问题内容: 这就是我在香草javascript中检查互联网连接的方式: 我的项目中有角度控制器和模块。我应该在上面的代码放在哪里?它应在全局上下文中执行,而不应分配给某个控制器。也许有某种全局控制器? 问题答案: 首先,我建议您听在线/离线活动。 您可以在AnguarJS中以这种方式进行操作: 注意:我在方法中包装了根范围变量的更改,以通知Angular某些更改。 之后,您可以: 在控制器中: 在

  • 问题内容: 如何创建一个JavaScript页面来检测用户的互联网速度并将其显示在页面上?诸如 “您的互联网速度为?? / ??”之类的信息 Kb / s”。 问题答案: 可能在某种程度上但不是很准确,其想法是加载具有已知文件大小的图像,然后在其事件中测量触发该事件之前经过的时间,然后将此时间除以图像文件大小。 可以在这里找到示例:使用javascript计算速度 应用了建议的修复的测试用例: 与

  • 问题内容: 我想看看是否有人在使用Java时有一种简单的方法来检测是否存在Internet连接。当前的应用程序在Windows的WinInit DLL中使用了“InternetGetConnectedState”方法,但是我的应用程序需要跨平台才能进行Mac操作,并且这种方法将无法使用。我完全不知道JNI可以在Java中使用DLL,它很快变得令人沮丧。 我唯一想到的方法是尝试打开与网站的URL连接

  • 进行与互联网间的连接测试,并显示结果。 名称* 目前使用的互联网连接之连接名称 SSID* 接入点的SSID 获取IP地址 显示是否可获取IP地址 互联网连接 显示是否可与互联网连接 登陆PlayStation®Network 显示是否能登陆PlayStation®Network NAT类型 显示PS Vita与互联网的连接方式 使用游戏的通信功能等时,可确认与其它PS Vita间的连接稳定性。

  • 我需要检查的设备是否有互联网连接,我搜索一些例子,但当我复制和粘贴的代码,我总是得到错误或不推荐的函数。我也不明白我必须把检查连接的方法放在哪里,因为我需要检查viewModel中的internet连接来发出一些请求,而我找到的所有方法都在参数中有上下文,而我无法在viewModel中获得上下文。 我尝试了这段代码,但我不明白我必须把它放在哪里,我得到 有人能给我解释一下怎么开这张支票吗?

  • 我试着从这个答案(被接受的答案)。我可以使用“PING”方法,但用户界面变黑了,因为它说它会阻止用户界面线程。它看起来不太好,令人不安,所以我尝试使用第二种方法“连接到互联网上的套接字”,但我不知道如何使用Kotlin中的类。 这是android studio将Java转换为kotlin的结果 但是我不知道如何使用它。我试过这样做: 它不起作用,导致了一个错误。它说我必须通过“消费者”。 我的问题