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

时间:2016-05-13 20:04:02

标签: android network-programming android-wifi android-6.0-marshmallow

这有很多类似的问题(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发出命令:(

谢谢

2 个答案:

答案 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

  1. 重新启动手机,连接到非互联网Wifi;
  2. 转到“设置”并创建新用户;
  3. 继续,继续并继续,直到您看到"正在检查连接";
  4. 一看到"检查连接",请关闭手机;
  5. 再次打开手机,您将进入"所有者"用户,保持它;
  6. 切换Wifi,感叹号应快速消失:)
  7. 删除该新用户或将其留在那里;
  8. 我不知道为什么,但它有效......