android如何检查wifi连接但没有互联网连接

时间:2015-09-04 09:26:21

标签: android android-wifi

android我的设备与wifi连接但如何连接wifi但这些没有互联网连接

以下是我的代码,我试图检查是否没有互联网连接

public static boolean isConnectedWifi(Context context) {
        NetworkInfo info=null;
        if(context!=null){
            info= IsNetConnectionAvailable.getNetworkInfo(context);
        }
        return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
    }

当没有互联网访问时,它总是返回

5 个答案:

答案 0 :(得分:2)

NetworInfo.isAvailableNetworkInfo.isConnected仅表示是否可以建立网络连接,它们不能表示所连接的情况是否可以访问公共互联网,长话短说,它们不能告诉我们该设备确实在线。

要检查设备是否在线,请尝试以下方法:

第一

@TargetApi(Build.VERSION_CODES.M)
public static boolean isNetworkOnline1(Context context) {
    boolean isOnline = false;
    try {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkCapabilities capabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());  // need ACCESS_NETWORK_STATE permission
        isOnline = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return isOnline;
}

优势:1.可以在UI线程上运行; 2.快速准确。

弱点:需要API> = 23和兼容性问题。

第二:

public static boolean isNetworkOnline2() {
    boolean isOnline = false;
    try {
        Runtime runtime = Runtime.getRuntime();
        Process p = runtime.exec("ping -c 1 8.8.8.8");
        int waitFor = p.waitFor();
        isOnline = waitFor == 0;    // only when the waitFor value is zero, the network is online indeed

        // BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        // String str;
        // while ((str = br.readLine()) != null) {
        //     System.out.println(str);     // you can get the ping detail info from Process.getInputStream()
        // }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return isOnline;
}

优势:1.可以在UI线程上运行; 2.您可以多次ping并统计最小/平均/最大延迟时间和丢包率。

弱点:compatibility issues

第三:

public static boolean isNetworkOnline3() {
    boolean isOnline = false;
    try {
        URL url = new URL("http://www.google.com"); // or your server address
        // URL url = new URL("http://www.baidu.com");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty("Connection", "close");
        conn.setConnectTimeout(3000);
        isOnline = conn.getResponseCode() == 200;
    } catch (IOException e) {
        e.printStackTrace();
    }

    return isOnline;
}

强度:可以在所有设备和API上使用。

缺点:操作耗时,无法在UI线程上运行。

第四名:

public static boolean isNetworkOnline4() {
    boolean isOnline = false;
    try {
        Socket socket = new Socket();
        socket.connect(new InetSocketAddress("8.8.8.8", 53), 3000);
        // socket.connect(new InetSocketAddress("114.114.114.114", 53), 3000);
        isOnline = true;
    } catch (IOException e) {
        e.printStackTrace();
    }

    return isOnline;
}

优势:1.可以在所有设备和API上使用; 2.相对快速和准确。

缺点:操作耗时,无法在UI线程上运行。

答案 1 :(得分:1)

您使用的代码仅用于检查您是否连接到wifi。它不会检查wifi是否缓慢。 (没有互联网意味着连接缓慢)。

我尝试使用此代码。在这里,我尝试点击google.com并设置了连接超时值。 如果这里互联网速度很好,那么返回的结果是200.所以我检查结果代码是否为200。如果没有,我会显示网络连接速度慢的警报。在asyntask中使用它,onPostExecute()检查返回结果的值。

HttpURLConnection urlc = null;
    try {
        urlc = (HttpURLConnection) (new URL("http://www.google.com")
                .openConnection());
    } catch (MalformedURLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    urlc.setRequestProperty("User-Agent", "Test");
    urlc.setRequestProperty("Connection", "close");
    urlc.setConnectTimeout(1000); // choose your own timeframe
    urlc.setReadTimeout(2000); // choose your own timeframe
    try {
        urlc.connect();

        // returning connection code.
        return (urlc.getResponseCode());
    } catch (IOException e1) {
        e1.printStackTrace();
    }

答案 2 :(得分:0)

检查以下代码集。

public boolean isNetworkAvailable(Context context) {
        boolean isOnline = false;
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        try {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                NetworkCapabilities capabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
                isOnline = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
            } else {
                NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
                isOnline = activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isOnline;
    }

答案 3 :(得分:-1)

在寻找了几天并且尝试了各种解决方案之后,有些并不完美,有些过于冗长,下面是LEVIT使用SOCKETS建议的解决方案,这对我来说是完美的。任何对此解决方案进行搜索的人都可以查阅此帖子。 How to check internet access on Android? InetAddress never times out

下面是代码部分,其中包含AsyncTask中的任务示例

class InternetCheck extends AsyncTask<Void,Void,Boolean> {

    private Consumer mConsumer;
    public  interface Consumer { void accept(Boolean internet); }

    public  InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }

    @Override protected Boolean doInBackground(Void... voids) { try {
        Socket sock = new Socket();
        sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
        sock.close();
        return true;
    } catch (IOException e) { return false; } }

    @Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}
///////////////////////////////////////////////////////////////////////////////////
// Usage

    new InternetCheck(internet -> { /* do something with boolean response */ });

以下是与解决方案有关的摘要 可能的问题 真的足够快吗?

是的,非常快;-)

除了在互联网上进行测试以外,没有可靠的方法来检查互联网吗?

据我所知,但请告诉我,我将编辑答案。

如果DNS断开了怎么办?

Google DNS(例如8.8.8.8)是世界上最大的公共DNS。截至2013年,它每天处理1300亿个请求。只是说,您的应用可能不会成为今天的话题。

需要哪些权限?

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

答案 4 :(得分:-2)

要检查您是否通过Wi-Fi连接到互联网,请查看以下代码段:

NetworkInfo getWifi(){
    ConnectivityManager connManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    return mWifi;
}

检查是否已连接;

if(getWifi().isConnected()) {
//wi-fi connected
}