首页 文章

检测Android上是否有可用的Internet连接[重复]

提问于
浏览
604

可能重复:如何检查Android上的互联网访问? InetAddress永远不会超时

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

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

问题是:

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

抛出此错误:

The constructor NetworkInfo is not visible.

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

  • 如何让上面的代码段工作?

  • 我怎么能在在线文档中找到自己需要的信息?

  • 您能为这种类型的检测提出更好的方法吗?

6 回答

  • 1289

    我检查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速度才能正常工作等 .

  • 14

    ConnectivityManagergetActiveNetworkInfo() 方法返回 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清单中 .

    Edit:

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

  • 67

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

    _我怎么能找到自己在在线文档中需要的信息?

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

  • 224

    第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!!!!");    
    }
    
  • 10

    可能我发现自己:

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

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

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

    您还需要:

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

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

相关问题