安卓棒棒糖当Wi-Fi没有网络连接时默认使用移动数据?

19

Android Lollipop似乎默认使用移动数据,当您连接的Wi-Fi没有互联网访问时。有人知道是否有官方文件记录了这一点吗?

我们有一个需要通过没有互联网的Wi-Fi连接到机器的应用程序。现在我们的客户报告说Wi-Fi连接不再工作,因为手机会自动切换到LTE

我的理解是手机仍然保持Wi-Fi连接,但同时使用LTE提供对互联网的访问 (lollipop-feature-spotlight-android-now-defaults-to-mobile-data-when-wi-fi-has-no-internet-access-signal-icon-adds-a-for-no-connection)。

我的理解是否正确?如果不是,有办法强制使用没有互联网的Wi-Fi吗?我在开发者文档中没有找到特别相关的内容。

非常感谢任何帮助。

4个回答

26

延伸 @ianhanniballake 的回答,我发现使用 ConnectivityManager.setProcessDefaultNetwork() 来绑定网络可以防止漫游并允许完全的TCP访问。因此,在 onAvailable() 回调中,你可以将应用程序进程绑定到该网络,而不是打开到特定URL的连接。

ConnectivityManager connection_manager = 
    (ConnectivityManager) activity.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

connection_manager.registerNetworkCallback(request.build(), new NetworkCallback() {

    @Override
    public void onAvailable(Network network) {
        ConnectivityManager.setProcessDefaultNetwork(network);
    }
}

从API级别23开始,请使用以下OnAvailable方法:

@Override
public void onAvailable(Network network) {
    connection_manager.bindProcessToNetwork(network);
}

仅供澄清,如果在从服务器下载时wifi连接中断并且移动数据连接成功,由于我们将进程绑定到wifi,所以它会等待wifi连接吗? - Rishikesh pathak
为了让这个在Android 9上工作,你需要在你的应用清单中添加以下权限:android.permission.CHANGE_NETWORK_STATE - matdev

8
默认情况下,Android 5.0仅在检测到有活动的互联网连接的网络上发送网络请求,因此,即使它已经“连接”到wifi,也不会通过网络发送任何数据。
然而,Android 5.0 APIs guide讨论了新的多网络支持:
Android 5.0提供了新的多网络API,让您的应用程序动态扫描具有特定功能的可用网络,并与它们建立连接。当您的应用程序需要专门的网络(例如SUPL、MMS或运营商计费网络),或者如果您想使用特定类型的传输协议发送数据时,此功能非常有用。
这使你能够为TRANSPORT_WIFI类型构建一个NetworkRequest,并在收到onAvailable()回调时通过Network.openConnection()将流量直接定向到它,即使wifi网络没有互联网访问,你也可以确保某些连接发生在wifi上。

这似乎很愚蠢,为什么不根据目标子网将流量路由到接口? - Max Ehrlich
3
@MaxEhrlich - 如果你有更好的实现,请 提交补丁 - ianhanniballake
2
我不应该这样做,其他操作系统已经做到了。Google显然已经有了他们想要的工作方式,并且可能会拒绝这样的补丁。 - Max Ehrlich
1
@ianhanniballake 是的,我正在浏览器上尝试通过wifi连接到我的本地服务器,但它没有连接到互联网...自从lollipop以来,我无法访问本地服务器,因为它试图通过移动网络连接。Max建议的应该是预期的行为。 - Pavan K

1

0

这不是为那些试图从他们自己的应用程序中解决连接问题的人提供的解决方案。但对于那些在此寻找使用一些标准应用程序(如Google Chrome)访问非互联网WiFi的解决方案的人:

您只需在手机设置中禁用“移动数据”,Chrome或任何其他应用程序将立即访问您的WiFi。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接