这有很多类似的问题(google for:“没有检测到互联网访问。不会自动重新连接。”或:android force wifi连接编程)。
我以为我有一个答案here,但在安装6.0.1更新后它停止了工作(我可能有1个安全补丁)。
似乎是behaviour change。
我有一些2013款nexus 7和6.0.1运行自助服务终端类型的应用程序,并希望以编程方式连接到没有互联网连接的特定无线网络。每个平板电脑都有一个唯一的静态IP地址:192.168.0.xx.我使用普通的java套接字构造函数并检查接口是否正在使用: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设置put global captive_portal_detection_enabled 0似乎确实有效,但是当路由器循环上电时,这不能在现场完成。当平板电脑重启电源时,此值似乎保持不变。现在这个值显示在全局设置列表中。另外,使用原始字符串:Settings.Global.getInt(getContentResolver(),“captive_portal_detection_enabled”);现在返回0。
编辑:看起来像设置它需要:android.permission.WRITE_SECURE_SETTINGS,但当然因为我们不是系统应用程序而放入清单时会失败。
编辑:尝试执行shell命令抛出:java.lang.SecurityException,所以看起来你需要从adb发出命令:(
谢谢
答案 0 :(得分:11)
您可以尝试将全局设置captive_portal_detection_enabled设置为0(false)。
实际发生的事情是,默认情况下,每次连接到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甚至不提供高级设置来启用/禁用用户自己。 (谷歌没有)。但也许它适合您的需求。
希望它有所帮助!
答案 1 :(得分:-1)
非root解决方案,这是一种黑客技术。 :P
我不知道为什么,但它有效......