Android - 以编程方式检查互联网连接并显示对话框(如果未连接)

时间:2013-07-26 11:35:51

标签: android android-webview android-internet android-websettings

我正在开展一个实时项目。当用户点击应用程序时出现欢迎屏幕(该屏幕上有一个webview)。如果互联网没有连接,那么应用程序崩溃。基本上,我的问题是以编程方式检查移动设备是否连接到互联网。如果没有,则不要将数据从webservice提取到webview中,并显示一个显示“检查你的网络连接”的对话框

在进行研究时,我发现了很多东西,我试图实现这一点。但是,它不满足我的要求

我的代码是,

public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    else
    {
        Description.setVisibility(View.INVISIBLE);
        new AlertDialog.Builder(WelcomePage.this)
        .setTitle(getResources().getString(R.string.app_name))
        .setMessage(
                getResources().getString(
                        R.string.internet_error))
        .setPositiveButton("OK", null).show();
    }
    return false;
}

我在doInBackground()的{​​{1}}

中调用此功能

请帮助!

14 个答案:

答案 0 :(得分:23)

您可以结帐此库:

https://github.com/novoda/merlin

您只需implement Connectable,当网络出现故障或出现时,您将收到回电信息。

因此,您可以在此方案中显示对话框。

您还可以在库中查询当前状态,并选择不执行网络任务

example

创建Merlin(使用Merlin.Builder())

merlin = new Merlin.Builder().withConnectableCallbacks().build(context);

在您的活动中绑定和取消绑定服务

@Override
protected void onResume() {
    super.onResume();
    merlin.bind();
}

@Override
protected void onPause() {
    super.onPause();
    merlin.unbind();
}

注册回调

merlin.registerConnectable(new Connectable() {
        @Override
        public void onConnect() {
            // Do something!
        }
});

演示中的MerlinActivity显示了一种从主应用程序代码中整理Merlin的简单方法。

答案 1 :(得分:14)

最后,我得到了答案。

ConnectivityManager conMgr =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
if (netInfo == null){
    Description.setVisibility(View.INVISIBLE);
    new AlertDialog.Builder(WelcomePage.this)
        .setTitle(getResources().getString(R.string.app_name))
        .setMessage(getResources().getString(R.string.internet_error))
        .setPositiveButton("OK", null).show();
}else{
    dialog = ProgressDialog.show(WelcomePage.this, "", "Loading...", true,false);
    new Welcome_Page().execute();
}

答案 2 :(得分:7)

检查互联网连接

 ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo netInfo = mgr.getActiveNetworkInfo();

        if (netInfo != null) {
            if (netInfo.isConnected()) {
                // Internet Available
            }else {
               //No internet
            }
        } else {
            //No internet
        }

答案 3 :(得分:6)

这是检查您的Internet连接的简单功能。如果Connected返回true,否则返回false。

 public boolean isInternetOn() {

        // get Connectivity Manager object to check connection
        ConnectivityManager connec =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        // Check for network connections
        if (connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTED ||
                connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED) {


            return true;

        } else if (
                connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                        connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.DISCONNECTED) {


            return false;
        }
        return false;
    }
}

这是一个检查互联网连接并检查有效或包含在服务器this中的网址的项目。

答案 4 :(得分:5)

NetworkInfo类已在API 29 (Android 10.0)中被弃用,有关更多详细信息,请参见此处:

This class was deprecated in API level 29. Use ConnectivityManager#getNetworkCapabilities or ConnectivityManager#getLinkProperties to get information synchronously

更新的代码(使用Kotlin)

var isConnected = false
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val networkCapabilities = connectivityManager.activeNetwork ?: return false
    val activeNetwork = connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
    isConnected = when {
        activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
        activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
        activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
        else -> false
    }
} else {
    connectivityManager.run {
        activeNetworkInfo?.run {
            isConnected = when (type) {
                ConnectivityManager.TYPE_WIFI -> true
                ConnectivityManager.TYPE_MOBILE -> true
                ConnectivityManager.TYPE_ETHERNET -> true
                else -> false
            }
        }
    }
}

答案 5 :(得分:2)

我尝试过上述不同的方法,除此之外我在某些情况下被抓住了。最后,我使用下面的代码片段进行网络通话......

try {
    InetAddress address = InetAddress.getByName("www.stackoverflow.com");
    //Connected to working internet connection
} catch (UnknownHostException e) {
    e.printStackTrace();
    //Internet not available
}

这在许多方面都很有用。如果这种方法不合适,请告诉我。

答案 6 :(得分:2)

if (InternetConnection.checkConnection(context)) {
    // Internet Available...
} else {
    // Internet Not Available...
}

只需复制下面的课程

public class InternetConnection {

    /** CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT */
    public static boolean checkConnection(Context context) {
        final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();

        if (activeNetworkInfo != null) { // connected to the internet
            Toast.makeText(context, activeNetworkInfo.getTypeName(), Toast.LENGTH_SHORT).show();

            if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
                return true;
            } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to the mobile provider's data plan
                return true;
            }
        }
        return false;
    }
}

授予清单

以下权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

答案 7 :(得分:1)

private boolean isDeviceOnline() {

        ConnectivityManager connMgr = ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

        return (networkInfo != null && networkInfo.isConnected());
    }

这是官方方式,Google也使用这种方式检查android设备的互联网连接。您可以在这里查看-link。 这是一种非常完美的方法,它实际上会检查互联网是否正常工作。

现在,您要解决特定的问题,请使用计时器类,然后在if(isdeviceOffline)中添加敬酒,然后进行敬酒。

答案 8 :(得分:1)

您的设备具有网络连接性并不意味着您可以访问互联网。它可以是没有互联网的wifi,也可以是没有数据包的数据SIM。 从API 23开始,您可以在下面使用它进行检查。您可以在用户界面上进行操作。或在广播接收器中。

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network currentnetwork = cm.getActiveNetwork();
if (currentnetwork != null) {
        if (cm.getNetworkCapabilities(currentnetwork).hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && cm.getNetworkCapabilities(currentnetwork).hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
            
            // do your stuff. We have internet.
    } else {
            // We have no internet connection.
        }

   } else {
       // We have no internet connection.
   }

答案 9 :(得分:0)

doInBackground运行在与主UI不同的线程上,因此您无法在此处创建显示对话框。相反,请覆盖AsyncTask中的onPreExecute,然后在那里进行测试。

答案 10 :(得分:0)

 public boolean isOnline() {
        NetworkInfo activeNetworkInfo = ((ConnectivityManager) 
        getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        return activeNetworkInfo != null && 
        activeNetworkInfo.isConnectedOrConnecting();
    }

答案 11 :(得分:0)

有关如何检查Internet连接的更新的Kotlin和Android 29版本(SDK 29中已弃用getNetworkInfo),适用于minSDK> = 23:

import Footer from "./Footer";
import pdf from "vue-pdf";
import db from "../db";

export default {
  name: "Read",
  components: {
    Navbar,
    Footer,
    pdf,
  },
  data() {
    return {
      novel: null, // data from Firebase is saved here
      src: null ,
      currentPage: 0,
      pageCount: 0,
      numPages: undefined,
    };
  },
  mounted() {
    this.src.promise.then((pdf) => {
      this.numPages = pdf.numPages;
    });
  },
  created() {
    let ref = db
      .collection("Novels")
      .where("novel_slug", "==", this.$route.params.novel_slug);
    ref.get().then((snapshot) => {
      snapshot.forEach((doc) => {
        this.novel = doc.data();
        this.novel.id = doc.id;
      });
      this.src = pdf.createLoadingTask(this.novel.novel_url); 
    });
  },
};
</script>

答案 12 :(得分:0)

这杯代码可帮助您从API级别16到30检查互联网连接是否可用

@SuppressWarnings("deprecation")
public static boolean isInternetAvailable(Activity activity) {
    ConnectivityManager conMgr = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network network = conMgr.getActiveNetwork();
        NetworkCapabilities networkCapabilities = conMgr.getNetworkCapabilities(network);
        if (networkCapabilities != null) {
            return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        } else return false;
    } else {
        // below API Level 23
        return conMgr.getActiveNetworkInfo() != null
                && conMgr.getActiveNetworkInfo().isAvailable()
                && conMgr.getActiveNetworkInfo().isConnected();
    }
}

答案 13 :(得分:-2)

互联网连接也会在onCreate()onResume()方法中进行检查。无需调用AsyncTask。

或者您可以在调用AsyncTask execute()方法之前调用

if(isOnline)
{
   MyAsyncTask task=new MyAMyAsyncTask();
   task.execute();

}

else
{
// no internet connection
}