【问题标题】:How to detect active internet connection in android studio如何在android studio中检测活动的互联网连接
【发布时间】:2020-11-29 01:19:18
【问题描述】:

我的应用程序基于 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);


        }


    }

【问题讨论】:

    标签: android android-studio webview


    【解决方案1】:

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

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

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

    编码愉快!

    【讨论】:

    • 感谢您的回答。我是 android studio 的新手,请告诉我在我的代码中添加此方法的位置。
    【解决方案2】:

    可能与this thread 重复。

    目前似乎没有合适的方法来检查 api

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-10
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多