【问题标题】:Lollipop Bad WiFi connection and Fallback to Mobile Network, how to Detect?Lollipop 坏 WiFi 连接和回退到移动网络,如何检测?
【发布时间】:2014-12-10 16:09:01
【问题描述】:

Lollipop 有一个新功能,这对我来说是个大问题。当 WiFi 网络“连接”但没有互联网时,系统将透明地回退到移动数据。 http://www.androidpolice.com/2014/10/18/lollipop-feature-spotlight-android-now-defaults-to-mobile-data-when-wi-fi-has-no-internet-access-signal-icon-adds-a-for-no-connection/

由于我为公司制作的应用程序之一是 WiFi 测试应用程序,类似于 Fing 等,这会导致 Lollipop 出现问题。我需要在坏的 WiFi 信号上发送数据包,以便可以定位和修复问题,例如 Traceroute、Ping 等。虽然外部 IP 可能无法正常工作,但在这种情况下内部 IP 地址应该仍然可以访问。然而,随着连接自动回退到移动网络,这不再可能。

我还没有找到任何解决方案来检测这一点。 NetworkInfo.getState()NetworkInfo.getDetailedState() 都报告“断开连接”,即使 WiFi 已连接并且外部连接不良。有没有人有什么建议?到目前为止的所有研究都让我相信我不能在 Android 中通过 WiFi 连接强制数据包,而且我还没有弄清楚我是否可以检测到这种状态。除了检测移动数据是否打开并要求用户关闭它,我还有哪些选择?

【问题讨论】:

    标签: java android android-5.0-lollipop


    【解决方案1】:

    您可以使用ConnectivityManager#requestNetwork() 请求特定的连接类型(或特定的网络)。

    然后您可以使用NetworkRequest.Builder 来请求 WiFi 网络,如下所示:

    ConnectivityManager cm = 
            (ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
    NetworkRequest request = new NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .build();
    
    cm.requestNetwork(request,
                      new ConnectivityManager.NetworkCallback() {
                          void onAvailable(Network network) {
                             // Do something once the network is available
                          }
                      });
    

    构建器还允许您指定附加约束(称为“功能”),因此您可以选择指定更多要求,例如特定 SSID。

    【讨论】:

    • 哇,我不知道 NetworkRequest.Builder 也没有看到它被提及。这太棒了,让我看看我能完成什么,如果我能让它工作,我会标记它。
    • 那么是否只有onAvailable回调中的代码通过Wifi网络运行,或者一旦你请求了wifi传输,你是否可以让它影响整个应用程序?
    • 获得所需的Network 后,您可以调用ConnectivityManager#setProcessDefaultNetwork() 以使用该网络处理来自您的进程的所有调用。
    • 有没有办法做类似于这个 Pre-Lollipop 的事情?我一直依赖这样一个事实,即如果您连接到 WiFi,但连接不良,手机仍会通过 WiFi 发送数据包......或者在棒棒糖之前做出这个假设是否安全,只是不用担心.
    • 我今天实现了这个并成功地获得了 onAvailable 回调,即使 WiFi 没有外部互联网,此时我调用 ConnectivityManager#setProcessDefaultNetwork(network)。我敢打赌这是按预期工作的,但是..我真的希望我能解决这个问题,因为我的 TraceRoute 函数和 Ping 函数启动命令行进程并读取 OutputBuffer,这些进程现在是独立的系统级进程,它们自己进程ID,不受我setProcessDefaultNetwork的影响,使用移动数据成功完成。有什么办法吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2011-11-02
    • 2015-07-02
    相关资源
    最近更新 更多