gpt4 book ai didi

java - 在 Android 5+ 中将应用程序设置为使用蜂窝网络而不是 WiFi

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:59 26 4
gpt4 key购买 nike

我们正在制作一个应用程序,即使在连接 WiFi 的情况下,也需要切换到蜂窝网络来满足某些请求。根据 ConnectionManager 文档,以下这些方法现已被弃用,但不清楚使用什么来代替。

  public void useMobileNetworkMode(Context context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
}

public void useDefaultNetworkMode(Context context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setNetworkPreference(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);

}

这些方法在 android 5/6 中仍然有效吗?如果有人有信息或东西可以替代这些方法,我将非常感激!

<小时/>

好的,关于这个问题再多说一点:)我已经设法调查 ConnectivityManager 并可以使用以下命令查看网络:

                     Network networkToUse = null;
Network[] networks;
networks = cm.getAllNetworks();
for (Network network : networks) {
NetworkInfo ni = cm.getNetworkInfo(network);
Log.e("NETWORKINFO", ni.getType() + " " + ni.getExtraInfo());
if (ni.getType()== ConnectivityManager.TYPE_WIFI) {
Log.e("NETWORKINFO", "isWifi");
if (ni.isConnected()) {
Log.e("NETWORKINFO", "and is connected");
if (networkToUse == null) {
networkToUse = network;
}
}
}
if (ni.getType()== ConnectivityManager.TYPE_MOBILE) {
Log.e("NETWORKINFO", "HasMobile");
if (ni.isConnected()) {
Log.e("NETWORKINFO", "and is connected");
networkToUse = network;
}
}
}

在这里我有点陷入困境,因为我无法从逻辑上找到一种方法来告诉应用程序在从 URL.openLink(); 执行 HttpsURLConnection 时使用这些网络之一。

<小时/>

更新:我刚刚注意到 WiFi 连接后不久,手机就消失了。有一段时间我两者兼而有之,但时间不长。

我也尝试过这个:

    final ConnectivityManager connection_manager =
(ConnectivityManager)httpsClient.getCheckoutController().getCheckout().getCurrentActivity().getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);

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

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

@Override
public void onAvailable(Network network) {
Log.e("NETWORKINFO", "FOUND A CELLULAR NETWORK " + connection_manager.getNetworkInfo(network));
}
});

request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {


@Override
public void onAvailable(Network network) {
Log.e("NETWORKINFO", "FOUND A WIFI NETWORK "+connection_manager.getNetworkInfo(network));
}
});

但与之前尝试中的“网络列表”一样,即使移动数据也打开,我也只进行了 1 次回调。

<小时/>

更新;好吧,我似乎有时会使用上述方法看到移动设备。但它似乎创建了 API 级别的意大利面条 hell 。有时移动回调也需要很长时间才能触发。我想知道这是否是因为它必须唤醒蜂窝调制解调器并等待握手或其他什么?

<小时/>

更新;我有另一个可能的建议,使用套接字(我对此没什么经验......)

有谁知道是否可以使用 HttpsURLConnection.getSocketFactory()SSLSocket 构建 CELLULAR SSL 连接套接字来执行 https 请求?

在这周的任务中任何信息都将非常受欢迎:D

<小时/>

更新:从谷歌的某人那里找到了一个很好且明确的答案: How to stay connected through mobile network after WIFI is connected on Android?

但是,在实现之后,我收到了移动设备的网络回调,但是当我打开 URL 连接并执行请求时,在收到响应之前,它似乎卡住了很长时间(大约 4 分钟)。

我有一部华为 5.0.1 手机,这是我可用的最高版本。显然这不好。不过,它尚未在 5.1 Galaxy S6 上进行测试并且可以正常工作。手机也可能如此。

最佳答案

根据 Android 文档,它不再适用于 Android 版本 5 及更高版本。

This method was deprecated in API level 21.

Functionality has been removed as it no longer makes sense, with many more >than two networks - we'd need an array to express preference. Instead we >use dynamic network properties of the networks to describe their >precedence.

关于java - 在 Android 5+ 中将应用程序设置为使用蜂窝网络而不是 WiFi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com