Java 棒棒糖坏了WiFi连接和回退到移动网络,如何检测?

Java 棒棒糖坏了WiFi连接和回退到移动网络,如何检测?,java,android,android-5.0-lollipop,Java,Android,Android 5.0 Lollipop,棒棒糖有一个新特性,这给我带来了一个巨大的问题。当WiFi网络“连接”但没有互联网时,该系统将透明地退回到移动数据。 由于我为我的公司制作的一个应用程序是WiFi测试应用程序,类似于Fing等,这导致了棒棒糖的问题。我需要在坏的WiFi信号上发送数据包,以便能够定位和修复问题,例如跟踪路由、Ping等。虽然外部IP可能不起作用,但在这种情况下仍然可以访问内部IP地址。然而,随着连接自动退回到移动网络,这已不再可能 我还没有找到任何解决办法来检测这一点NetworkInfo.getState()

棒棒糖有一个新特性,这给我带来了一个巨大的问题。当WiFi网络“连接”但没有互联网时,该系统将透明地退回到移动数据。

由于我为我的公司制作的一个应用程序是WiFi测试应用程序,类似于Fing等,这导致了棒棒糖的问题。我需要在坏的WiFi信号上发送数据包,以便能够定位和修复问题,例如跟踪路由、Ping等。虽然外部IP可能不起作用,但在这种情况下仍然可以访问内部IP地址。然而,随着连接自动退回到移动网络,这已不再可能


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

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

然后,您可以使用以下方式请求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传输,你能让它影响整个应用程序吗?一旦你拥有了你想要的
网络
,您可以通过该网络调用您进程中的所有调用。有没有类似于棒棒糖前的方法?我一直依赖这样一个事实,如果你连接到WiFi,但连接不好,手机仍然会通过WiFi发送数据包。。。或者在棒棒糖之前就这样假设是安全的,不用担心。我今天实现了这一点,并且成功地获得了一个可用的回拨,即使WiFi没有外部互联网,此时我调用
ConnectivityManager\setProcessDefaultNetwork(network)
。不过,我敢打赌,这一切都如期进行。。我真的希望我能绕过这个问题,因为我的TraceRoute函数和Ping函数会启动命令行进程,并读取OutputBuffer,这些进程现在是独立的系统级进程,具有自己的进程ID,不受我的
setProcessDefaultNetwork
的影响,并使用移动数据成功完成。有办法吗?