【问题标题】:Android, how to override the internet connectivity check when connecting to wifi network?Android,连接到wifi网络时如何覆盖互联网连接检查?
【发布时间】:2016-09-07 17:12:52
【问题描述】:

我注意到在 Marshmallow(例如 Nexus 6P)和一些最近更新的 Lollipop 手机(例如 Galaxy S5)上,当我连接到没有互联网的 wifi 网络时,网络将无法完全连接,直到用户接受说明网络无法访问 Internet 的提示。

是否有任何方法可以通过编程绕过此检查并允许 wifi 连接继续进行,而不管互联网访问如何?

【问题讨论】:

  • Android 本身并没有公开任何这样做的方法。您可以通过反思每个供应商来做到这一点。似乎只是一个解决方案,而不是一个好的解决方案。

标签: android android-wifi


【解决方案1】:

没有尝试这些,但您可以尝试将 www.google.com 和 8.8.8.8 重定向到 127.0.0.1(您可以使用 iptables 或修改 /system/hosts)。您还可以尝试挖掘 AOSP 源代码(这些是我在 AOSP 中找到的唯一 isReachable() 检查)。

如果您决定查找 AOSP,您可以启动 here

附:您需要 root 才能进行 iptables 和 /system/hosts 操作。

【讨论】:

  • 这种重定向不会永远阻止他使用谷歌吗?
  • 可以创建一个循环检查连接,一旦有活动的互联网连接,它将删除该 iptables 规则。
【解决方案2】:

你可以试试这个

验证网络可用性:

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

验证互联网访问(连接的 wifi 是否处于活动状态):

public Boolean isOnline() {
    try {
        Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
        int returnVal = p1.waitFor();
        boolean reachable = (returnVal==0);
        return reachable;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return false;
}

【讨论】:

    【解决方案3】:

    检查这些链接..

    check Internet connection

    public final boolean isInternetOn()
    {
      ConnectivityManager connec = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
    
      // ARE WE CONNECTED TO THE NET
      if ( connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED ||
           connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED )
      {
        // MESSAGE TO SCREEN FOR TESTING (IF REQ)
        //Toast.makeText(this, connectionType + ” connected”, Toast.LENGTH_SHORT).show();
        return true;
      }
      else if ( connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED
        ||  connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED  )
      {
        return false;
      }
    
      return false;
      }
    

    check Internet connection with url if available

    public static boolean hasActiveInternetConnection(Context context) {
        if (isNetworkAvailable(context)) {
            try {
                HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
                urlc.setRequestProperty("User-Agent", "Test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1500); 
                urlc.connect();
                return (urlc.getResponseCode() == 200);
            } catch (IOException e) {
                Log.e(LOG_TAG, "Error checking internet connection", e);
            }
        } else {
            Log.d(LOG_TAG, "No network available!");
        }
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 2017-05-23
      • 2011-11-02
      • 1970-01-01
      • 2018-02-02
      • 2012-06-12
      • 1970-01-01
      相关资源
      最近更新 更多