簡體   English   中英

android如何檢查wifi已連接但沒有互聯網連接

[英]android how to check wifi is connected but no internet connection

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);
    }

當沒有互聯網訪問時它總是返回true

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多次,統計最小/平均/最大延遲時間和丟包率。

弱點:兼容性問題

第三:

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線程上運行。

檢查下面的一組代碼。

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;
    }

您使用的代碼僅用於檢查您是否已連接到 wifi。 它不會檢查該 wifi 是否很慢。 (沒有互聯網意味着連接速度慢)。

我嘗試使用此代碼。 在這里,我嘗試訪問 google.com 並設置了連接超時值。 如果這里網速好,那么返回的結果是200。所以我檢查結果代碼是否是200。 如果沒有,我會顯示互聯網連接速度緩慢的警報。 在異步任務中使用它,並且 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();
    }

在搜索了幾天並嘗試了各種解決方案之后,有些不完美,有些太長,下面是 LEVIT 使用 SOCKETS 建議的解決方案,這對我來說是完美的。 任何搜索此解決方案的人都可以參考這篇文章。 如何在Android上檢查互聯網訪問? InetAddress 永遠不會超時

下面是代碼的一部分,其中包含 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" />

要檢查您是否通過 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM