连接到离线 Wi-Fi 并继续使用移动数据(也适用于所有其他应用)

Connect to an offline Wi-Fi and keep using mobile data (for all other apps, too)

我有一个应用程序需要通过 Wi-Fi 连接到硬件。为此,硬件提供了一个 离线 Wi-Fi 热点 。热点的 DHCP 没有给我们网关或 DNS,所以我们马上就知道,它仅供离线使用。

最终用户将在工作并且必须始终保持 Wi-Fi 连接,以便接收传感器数据并在数据出现问题时发出警报。但与此同时,我们不想强迫最终用户使用他的移动设备离线。他应该能够为我们的应用程序和他拥有的所有其他应用程序使用他的移动数据。

虽然我可以通过调用 android.net.ConnectivityManager.requestNetwork 来控制它。但它似乎不能可靠地工作。如果 所有其他应用程序 可以访问移动数据,在 我的应用程序 中调用 requestNetwork 会影响吗?

这甚至是我们可以控制的事情吗?我在不同制造商和 android 版本的多台设备上对此进行了测试,它们的行为都不同。

例如Pixel 3a 工作正常。一段时间后,我收到有关离线 Wi-Fi 的通知。如果我忽略它,它会继续工作。如果我在上面按 "yes",我处于离线状态并连接到 Wi-Fi。

每次我请求时,华为 P20 Lite 似乎都会为我的移动数据 NetworkCallback 触发 OnLost 事件。就像它每次重新连接时都试图取消移动连接一样,因为我在 wifi 中。某些设备提供 "Smart Switch"(三星)或 "Wi-Fi+"(华为)模式,默认情况下未启用。要求用户打开它似乎很麻烦,因为他们可能不想在不同的场景中使用它。

以下是针对不同设备的一些示例:

当使用 requestNetwork() 连接到离线 wifi 网络时,您需要一个 ConnectivityManager 的实例。您可以通过以下方式获取:

final ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

此方法 returns OS 的连接管理器。因此,其他应用程序也会受到您将 ConnectivityManager 放入的 "sticky" 模式的影响。

遗憾的是,我认为应用程序不可能强制OS保持与离线 Wifi 网络的连接,同时继续使用移动数据。

在各种设备上尝试之后,我可以说,不可能在所有设备上始终如一地实现所需的行为。 几乎所有设备的行为都不同。 OS-版本并不是一个真正的因素。这更多取决于供应商如何处理用户连接到离线 wifi 的情况。

根据设备的不同,可能会保持离线 wifi 连接并同时为所有应用使用移动数据。但是 OS 可以自动断开您的连接或将您锁定到离线 wifi 并禁用移动数据。可能是因为用户在系统对话框中选择了一个选项,如上所示。

在后一种情况下,可以为自己的应用程序强制与ConnectivityManager建立移动数据连接。但是不可能让所有其他应用程序也使用此移动连接。