这有很多类似的问题(谷歌:“未检测到互联网访问。不会自动重新连接。”或:android 以编程方式强制 wifi 连接)。
我以为我有答案here ,但它在安装 6.0.1 更新后停止工作(我可能有 1 个安全补丁)。
这似乎是一个 behaviour change .
我有一些 2013 年的 nexus 7 和 6.0.1,它们运行一个信息亭类型的应用程序,并希望以编程方式连接到没有互联网连接的特定无线网络。每台平板电脑都有一个唯一的静态 IP 地址,格式为:192.168.0.xx。我使用普通的 java 套接字构造函数并使用以下方法检查接口(interface)是否已启动:NetworkInterface.getNetworkInterfaces()。
已建立手动连接。有时会有一个对话框询问您是否要始终连接。我总是勾选是。
但 wifi 显示:“未检测到互联网访问。在路由器循环电源后不会自动重新连接”。
断开连接、启用、重新连接不起作用。充其量它得到: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 studio 不可见。
另外,做一个全局设置列表不包含常量。
编辑做一个 adb shell settings put global captive_portal_detection_enabled 0 似乎确实有效,但是当路由器循环电源时,这不能在现场完成。这个值似乎在平板电脑循环供电时持续存在。现在这个值出现在全局设置列表中。同样,使用原始字符串:Settings.Global.getInt(getContentResolver(),"captive_portal_detection_enabled");现在返回 0。
编辑:看起来设置它需要:android.permission.WRITE_SECURE_SETTINGS,但是当然这在放入 list 时会失败,因为我们不是系统应用程序。
编辑:尝试执行 shell 命令抛出:java.lang.SecurityException,因此看起来您需要从 adb 发出命令 :(
谢谢
最佳答案
您能否尝试将全局设置 captive_portal_detection_enabled 设置为 0(假)。
实际情况是,默认情况下,每次您连接到 wifi 时,FW 都会针对服务器(通常是 google)进行测试,以查看它是否是强制 wifi(需要登录)。所以如果你的 wifi 没有连接到谷歌,这个检查就会失败。之后,设备知道 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 甚至不提供高级设置来由用户自己启用/禁用它。 (谷歌没有)。但也许它适合您的需求。
希望对您有所帮助!
关于android 6.0.1 强制 wifi 连接无法访问互联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37218510/