android 6.0.1 强制 wifi 连接,无法访问互联网

android 6.0.1 force wifi connection with no internet access

这有很多类似的问题(google 用于:"no internet access detected. won't automatically reconnect." 或:android 以编程方式强制 wifi 连接)。

我以为我有答案here,但它在安装 6.0.1 更新后停止工作(我有 5 月 1 个安全补丁)。

这好像是 behaviour change.

我有一些 2013 年的 nexus 7 和 6.0.1 运行 一个信息亭类型的应用程序,我想以编程方式连接到没有互联网连接的特定无线网络。每台平板电脑都有一个唯一的静态 IP 地址,格式为:192.168.0.xx。我使用普通的 java 套接字构造函数并检查接口是否可用:NetworkInterface.getNetworkInterfaces().

已建立手动连接。有时会有一个对话框询问您是否要始终连接。我总是检查是。

但 wifi 显示:"no internet access detected. won't automatically reconnect" 在路由器重新启动后。

断开连接、启用、重新连接不起作用。充其量它得到: ip6-localhost/::1.

有没有人成功使用过请求对象或 bindProcessToNetwork?

编辑:related.

编辑:问题似乎在于:CAPTIVE_PORTAL_DETECTION_ENABLED - 这个字符串 似乎 在源代码中定义:

public static final String
        CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled";
    ...
    MOVED_TO_GLOBAL.add(Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED);

但抛出“android.provider.Settings$SettingNotFoundException: captive_portal_detection_enabled 当明确使用并且对 android 工作室不可见时。

另外,做一个全局设置列表不包含常量。

edit doing a adb shell settings put global captive_portal_detection_enabled 0 似乎确实有效,但是当路由器循环通电时,这不能在现场完成。这个值 似乎 在平板电脑循环电源时持续存在。现在这个值出现在全局设置列表中。同样,使用原始字符串:Settings.Global.getInt(getContentResolver(),"captive_portal_detection_enabled");现在 returns 0.

编辑:看起来设置需要:android.permission.WRITE_SECURE_SETTINGS,但是当然这在放入清单时会失败,因为我们不是系统应用程序。

编辑:尝试执行 shell 命令抛出:java.lang.SecurityException,所以看起来您需要从 adb 发出命令 :(

感谢

您能否尝试将全局设置 captive_portal_detection_enabled 设置为 0(假)。

实际情况是,默认情况下,每次您连接到 wifi 时,FW 都会针对服务器(通常 google)进行测试,以查看它是否是强制 wifi(需要登录)。因此,如果您的 wifi 未连接到 google,此检查将失败。之后,设备知道 wifi 没有互联网连接,根本不会自动连接到它。

将此设置设为 0,将避免此检查。

程序化Settings.Global.putInt(getContentResolver(), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0);

您可以通过 adb 进行测试:

adb shell settings put global captive_portal_detection_enabled 0

并像这样检索它的值:

adb shell settings list global | grep "captive"

恕我直言,这不是一件好事,因为您正在为用户更改设置,而许多 FW 甚至不提供 enable/disable 由用户自己进行的高级设置。 (Google 没有)。但也许它适合您的需求。

希望对您有所帮助!

一种非root解决方案,是一种黑客技术。 :P

  1. 重启phone,连接到非互联网Wifi;
  2. 转到“设置”并创建一个新用户;
  3. 继续,继续,再继续,直到看到 "Checking connection";
  4. 一看到 "checking connection",就关掉 phone;
  5. 再次打开您的phone,您将进入"Owner"用户,保持它;
  6. 切换Wifi,感叹号应该会很快消失:)
  7. 删除该新用户或将其留在那里;

我不知道为什么,但它有效...