检测Android上是否有可用的Internet连接

Detect whether there is an Internet connection available on Android

本问题已经有最佳答案,请猛点这里访问。

我需要检测Android设备是否已连接到Internet。

NetworkInfo类提供听起来很完美的非静态方法isAvailable()

问题是:

1
2
3
4
NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

抛出此错误:

1
The constructor NetworkInfo is not visible.

安全的赌注是有另一个类返回NetworkInfo对象。 但我不知道哪个。

  • 如何让上面的代码段工作?
  • 我怎么能找到自己在在线文档中需要的信息?
  • 你能为这种类型的检测提出更好的方法吗?

  • ConnectivityManagergetActiveNetworkInfo()方法返回一个NetworkInfo实例,表示它可以找到的第一个连接的网络接口,如果没有连接,则返回null。检查此方法是否返回null应该足以判断是否有可用的Internet连接。

    1
    2
    3
    4
    5
    6
    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager
              = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

    您还需要:

    1
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    在你的Android清单中。

    编辑:

    请注意,拥有活动网络接口并不能保证特定网络服务可用。网络问题,服务器停机,低信号,强制网络门户,内容过滤器等都可能阻止您的应用访问服务器。例如,在收到Twitter服务的有效回复之前,您无法确定您的应用是否可以访问Twitter。


    我检查Wi-Fi和移动互联网如下......

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private boolean haveNetworkConnection() {
        boolean haveConnectedWifi = false;
        boolean haveConnectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();
        for (NetworkInfo ni : netInfo) {
            if (ni.getTypeName().equalsIgnoreCase("WIFI"))
                if (ni.isConnected())
                    haveConnectedWifi = true;
            if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                if (ni.isConnected())
                    haveConnectedMobile = true;
        }
        return haveConnectedWifi || haveConnectedMobile;
    }

    显然,可以轻松修改它以检查各个特定的连接类型,例如,如果您的应用需要更高的Wi-Fi速度才能正常工作等。


    第1步:在项目中创建一个AppStatus类(您也可以给出任何其他名称)。
    然后,请将以下给定的行粘贴到您的代码中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.util.Log;


    public class AppStatus {

        private static AppStatus instance = new AppStatus();
        static Context context;
        ConnectivityManager connectivityManager;
        NetworkInfo wifiInfo, mobileInfo;
        boolean connected = false;

        public static AppStatus getInstance(Context ctx) {
            context = ctx.getApplicationContext();
            return instance;
        }

        public boolean isOnline() {
            try {
                connectivityManager = (ConnectivityManager) context
                            .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            connected = networkInfo != null && networkInfo.isAvailable() &&
                    networkInfo.isConnected();
            return connected;


            } catch (Exception e) {
                System.out.println("CheckConnectivity Exception:" + e.getMessage());
                Log.v("connectivity", e.toString());
            }
            return connected;
        }
    }

    第2步:现在检查您的设备是否具有网络连接,然后只需将此代码段添加到您要检查的位置...

    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (AppStatus.getInstance(this).isOnline()) {

        Toast.makeText(this,"You are online!!!!",8000).show();

    } else {

        Toast.makeText(this,"You are not online!!!!",8000).show();
        Log.v("Home","############################You are not online!!!!");    
    }


    另一个重要的说明。您必须在AndroidManifest.xml中设置android.permission.ACCESS_NETWORK_STATE才能使其正常工作。

    _ how could I have found myself the information I needed in the online documentation?

    您只需要正确阅读课程文档,您就可以找到所需的所有答案。查看ConnectivityManager上的文档。说明会告诉您该怎么做。


    The getActiveNetworkInfo() method of ConnectivityManager returns a
    NetworkInfo instance representing the first connected network
    interface it can find or null if none if the interfaces are connected.
    Checking if this method returns null should be enough to tell if an
    internet connection is available.

    1
    2
    3
    4
    5
    private boolean isNetworkAvailable() {
         ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
         return activeNetworkInfo != null;
    }

    您还需要:

    in your
    android manifest.

    Edit:

    Note that having an active network interface doesn't guarantee that a
    particular networked service is available. Networks issues, server
    downtime, low signal, captive portals, content filters and the like
    can all prevent your app from reaching a server. For instance you
    can't tell for sure if your app can reach Twitter until you receive a
    valid response from the Twitter service.

    getActiveNetworkInfo()不应该永远不会给null。当他们提出这个问题时,我不知道他们在想什么。它应该总是给你一个对象。


    可能我发现自己:

    1
    2
    ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();