31

我正在做一个现场项目。当用户点击应用程序时。欢迎屏幕出现(该屏幕上有一个网络视图)。如果未连接互联网,则应用程序崩溃。基本上,我的问题是以编程方式检查移动设备是否连接到互联网。如果没有,则不要从 web 服务获取数据到 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()函数AsyncTask

请帮忙!

4

14 回答 14

29

你可以签出这个库:

https://github.com/novoda/merlin

当网络出现故障或出现时,您implement Connectable将收到回调。

因此,您可以在这种情况下显示您的对话框。

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

例子

创建 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 从主应用程序代码中整理出来的简单方法。

于 2013-07-26T11:56:05.187 回答
20

最后,我得到了答案。

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();
}
于 2013-08-01T12:43:12.553 回答
13

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

此类在 API 级别 29 中已弃用。使用 ConnectivityManager#getNetworkCapabilities 或 ConnectivityManager#getLinkProperties 同步获取信息

更新代码(使用 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
            }
        }
    }
}
于 2020-01-16T17:27:24.633 回答
12

检查互联网连接

 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
        }
于 2017-04-26T12:35:47.900 回答
6

这是检查您的 Internet 连接的简单功能。如果已连接返回 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;
    }
}

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

于 2016-05-05T06:51:33.627 回答
3
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" />
于 2018-03-28T07:51:07.770 回答
2

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

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

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

于 2016-07-20T05:27:47.140 回答
1
 public boolean isOnline() {
        NetworkInfo activeNetworkInfo = ((ConnectivityManager) 
        getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        return activeNetworkInfo != null && 
        activeNetworkInfo.isConnectedOrConnecting();
    }
于 2019-07-24T12:08:04.323 回答
1
private boolean isOnline() {
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        return (networkInfo != null && networkInfo.isConnected());
    }

这是官方的方式,谷歌也使用同样的方式来检查安卓设备的互联网连接。您可以在此处查看 -链接。这是一个非常完美的方法,它实际上检查互联网是否正常工作。

现在您的具体问题,使用计时器类,然后在 if(isOnline) 然后吐司中放入吐司。

于 2020-09-04T09:32:33.043 回答
1

您的设备具有网络连接这一事实并不意味着您可以访问互联网。它可以是没有互联网的 wifi,也可以是没有数据包的数据 SIM。从 API 23 开始,您可以使用下面的方法来检查它。您可以在 UI 上执行此操作。或在广播接收器内。

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.
   }
于 2020-09-18T08:43:03.757 回答
0

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

于 2013-07-26T11:38:32.960 回答
0

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

fun hasInternet(): Boolean {
    val connectivityManager = appContainer.contextProvider.currentAppContext()
        .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val network = connectivityManager.activeNetwork

    val capabilities = connectivityManager.getNetworkCapabilities(network)
    var hasInternet = false
    capabilities?.let {
        hasInternet = it.hasCapability(NET_CAPABILITY_INTERNET)
    }
    return hasInternet
}
于 2020-08-11T12:10:06.353 回答
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();
    }
}
于 2020-10-06T11:58:36.273 回答
-3

互联网连接也可以签入onCreate()onResume()方法。无需在 AsyncTask 内部调用。

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

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

}

else
{
// no internet connection
}
于 2013-07-26T11:42:44.557 回答