当前位置: 首页 > 知识库问答 >
问题:

Android如何检查无线网络已连接但没有互联网连接

澹台季萌
2023-03-14

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

共有3个答案

刘泰
2023-03-14

经过几天的搜索和尝试各种解决方案后,有些并不完美,有些太长了,下面是LEVIT建议的使用套接字的解决方案,对我来说很完美。任何一个搜索这个解决方案的人都可以参考这个帖子。如何在Android上查上网?InetAddress永远不会超时

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

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" />
章光华
2023-03-14

检查以下一组代码。

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;
    }
魏浩广
2023-03-14

< code > networinfo . is available 和< code > network info . is connected 仅指示网络连接是否可能或存在,它们不能指示连接的情况是否可以访问公共互联网,长话短说,它们不能告诉我们设备确实在线。

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

第一:

@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.又快又准。

弱点:需要接口

第二:

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线程上运行。

 类似资料:
  • 我需要检查的设备是否有互联网连接,我搜索一些例子,但当我复制和粘贴的代码,我总是得到错误或不推荐的函数。我也不明白我必须把检查连接的方法放在哪里,因为我需要检查viewModel中的internet连接来发出一些请求,而我找到的所有方法都在参数中有上下文,而我无法在viewModel中获得上下文。 我尝试了这段代码,但我不明白我必须把它放在哪里,我得到 有人能给我解释一下怎么开这张支票吗?

  • 我试着从这个答案(被接受的答案)。我可以使用“PING”方法,但用户界面变黑了,因为它说它会阻止用户界面线程。它看起来不太好,令人不安,所以我尝试使用第二种方法“连接到互联网上的套接字”,但我不知道如何使用Kotlin中的类。 这是android studio将Java转换为kotlin的结果 但是我不知道如何使用它。我试过这样做: 它不起作用,导致了一个错误。它说我必须通过“消费者”。 我的问题

  • 这是我试图从云端获取数据的url,如果互联网已连接,则将执行异步任务。我编写了此方法,用于检查互联网是否已连接,在我的移动wifi中,当我尝试执行时,出现异常

  • 问题内容: 这就是我在香草javascript中检查互联网连接的方式: 我的项目中有角度控制器和模块。我应该在上面的代码放在哪里?它应在全局上下文中执行,而不应分配给某个控制器。也许有某种全局控制器? 问题答案: 首先,我建议您听在线/离线活动。 您可以在AnguarJS中以这种方式进行操作: 注意:我在方法中包装了根范围变量的更改,以通知Angular某些更改。 之后,您可以: 在控制器中: 在

  • 问题内容: 当我尝试在iPhone上检查互联网连接时,出现了很多错误。谁能帮我解决这个问题? 代码: 代码错误: 如果无法读取,则错误1表示: “ Int”不可转换为“ SCNetworkReachabilityFlags” 错误2和3: 找不到接受提供的参数的’init’的重载 问题答案: 为了解决注释中提到的4G问题,我已使用@AshleyMills可达性实现作为参考并重写了Swift 3.1

  • 你好,我有一个应用程序,有两个活动:主页面和详细页面。 当有互联网连接时,用户可以从主页面导航到详细信息页面。当没有网络连接时,他不能这样做。 问题是:当我进入详细信息页面并关闭wifi时,我想完成此活动,我如何实现此功能?我在主要活动类中检查过类似这样的内容: 当我启动有互联网或没有互联网的应用程序时,它都可以正常工作,但是当我在运行时关闭wifi时,它不起作用。 无论如何,谢谢你!