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
- 重启phone,连接到非互联网Wifi;
- 转到“设置”并创建一个新用户;
- 继续,继续,再继续,直到看到 "Checking connection";
- 一看到 "checking connection",就关掉 phone;
- 再次打开您的phone,您将进入"Owner"用户,保持它;
- 切换Wifi,感叹号应该会很快消失:)
- 删除该新用户或将其留在那里;
我不知道为什么,但它有效...
这有很多类似的问题(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
- 重启phone,连接到非互联网Wifi;
- 转到“设置”并创建一个新用户;
- 继续,继续,再继续,直到看到 "Checking connection";
- 一看到 "checking connection",就关掉 phone;
- 再次打开您的phone,您将进入"Owner"用户,保持它;
- 切换Wifi,感叹号应该会很快消失:)
- 删除该新用户或将其留在那里;
我不知道为什么,但它有效...