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

检测Android上是否有可用的Internet连接,android,internet-connection,android-internet,Android,Internet Connection,Android Internet,可能重复: 我需要检测Android设备是否连接到互联网 NetworkInfo类提供了一个听起来很完美的非静态方法isAvailable() 问题是: NetworkInfo ni = new NetworkInfo(); if (!ni.isAvailable()) { // do something } 抛出此错误: 构造函数NetworkInfo不可见。 可以肯定的是,还有另一个类返回NetworkInfo对象。但我不知道是哪个 如何让上述代码片段正常工作 我怎样才能在在线

可能重复:

我需要检测Android设备是否连接到互联网

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

问题是:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}
抛出此错误:

构造函数NetworkInfo不可见。
可以肯定的是,还有另一个类返回
NetworkInfo
对象。但我不知道是哪个

  • 如何让上述代码片段正常工作
  • 我怎样才能在在线文档中找到我需要的信息
  • 你能建议一种更好的检测方法吗

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

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager 
              = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
    
    您还需要:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    
    
    在你的android清单中

    编辑:


    请注意,具有活动网络接口并不保证特定的网络服务可用。网络问题、服务器宕机、低信号、外加门户、内容过滤器等都会阻止应用程序访问服务器。例如,在收到Twitter服务的有效响应之前,您无法确定您的应用程序是否可以访问Twitter。

    可能我发现自己:

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

    这也是另一个重要的注意事项。您必须在AndroidManifest.xml中设置
    android.permission.ACCESS_NETWORK_STATE
    ,才能使其工作

    _我怎样才能在在线文档中找到我需要的信息


    你只需要适当地阅读这些类的文档,你就会找到你想要的所有答案。查看上的文档。描述告诉您该怎么做。

    我检查Wi-fi和移动互联网,如下所示

    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(您也可以提供任何其他名称)。 然后请将下面给出的行粘贴到您的代码中:

    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:现在要检查您的设备是否具有网络连接,只需将此代码段添加到您想要检查的位置

    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!!!!");    
    }
    
    ConnectionManager的getActiveNetworkInfo()方法返回 代表第一个连接网络的NetworkInfo实例 接口它可以找到,如果没有,则为null,如果接口已连接。 检查此方法是否返回null应该足以说明 互联网连接可用

    您还需要:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    在你的 android清单

    编辑:

    请注意,具有活动网络接口并不保证 提供特定的网络服务。网络问题,服务器 停机时间、低信号、捕获门户、内容过滤器等 所有这些都会阻止你的应用到达服务器。比如你 在收到通知之前,无法确定您的应用程序是否可以访问Twitter 来自Twitter服务的有效响应


    getActiveNetworkInfo()不应提供null。我不知道他们想到这个的时候在想什么。它应该总是给你一个对象

    如果没有活动网络,例如飞机模式,则
    getActiveNetworkInfo()
    可能会返回null。是的,它将返回null,并且这是未记录的。是的,因此首先执行null检查activeNetwork!=null&&activeNetwork.isConnectedOrConnecting();我喜欢这行:boolean isWifiConnected=activeNetwork!=null&&activeNetwork.isConnectedOrConnecting()&&activeNetwork.getType()==ConnectivityManager.TYPE\u WIFI;有人能更详细地解释这句话吗?我觉得很奇怪:first activeNetwork!=代码很好,我只是希望人们在编写Java haveConnectedWifi,haveConnectedMobile时能坚持Java编码风格。我知道这是一件小事,但一致的代码更具可读性。在良好的实践中,最好将字符串放在左边,如果不需要,最好不要使用equalsIgnoreCase:if(“WIFI”).equals(ni.getTypeName())@Stuart Axon:哦,我想这就是它的工作方式。自从20世纪70年代末开始编程以来,我已经编写了比我记忆中更多的语言,显然我已经养成了许多坏习惯。总的来说,我遵循的原则是,如果它起作用,那么……好吧,它就起作用了,这就是我所关心的。上面的代码片段是完全独立的,任何具有合理编程经验的人都可以轻松地完成,而且(最重要的是)如果有人将其剪切并粘贴到自己的代码中,这对他们来说是可行的。很抱歉,我是一个Android/Java noob。我不是在追求分数或任何东西(或者不管怎样),我发现代码很有用,但我想我的坏脾气是在试图提供一些半有用的反馈。@BoD:
    getType()
    提供了更精细的粒度(我相信),可能会返回
    TYPE\u MOBILE
    TYPE\u MOBILE\u DUN
    TYPE\u MOBILE\u HIPRI
    等等。我对什么类型的“mobile”连接可用的细节不感兴趣,
    getTypeName()
    将简单地为所有连接返回“mobile”。ConnectionVityManager类的描述没有告诉我如何使用该类,它只是方法签名和常量值的列表。这个问题的答案中包含的信息比文档中包含的信息要多。没有提到getActiveNetworkInfo()可以返回null,没有提到需要访问\网络\状态权限,等等。