![](/img/trans.png)
[英]How do I perform network operation programmatically on WiFi and cellular data separately when both are connected in Android Studio?
[英]Set app to use cellular network rather than WiFi in android 5+
我们正在制作一个应用程序,即使连接了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
时,我从逻辑上看不到告诉应用程序使用这些网络之一的方法URL.openLink();
。
更新:我刚刚注意到,移动设备在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级意大利面。 有时也需要很长时间才能触发移动回调。 我想知道这是否是因为它必须唤醒蜂窝调制解调器并等待其握手或其他原因吗?
更新; 我还有另一个使用Socket的建议(我对此经验不足。)
有谁知道是否可以使用HttpsURLConnection.getSocketFactory()
和SSLSocket
构建一个CELLULAR SSL连接套接字来执行https请求?
在本周的漫长探索中,任何信息都将非常受欢迎:D
更新:在Google的某人身上找到了一个很好的分类答案: 在Android上连接WIFI后如何通过移动网络保持连接?
但是在实施之后,我得到了针对移动设备的网络回调,但是当我打开URL连接并执行请求时,在获得响应之前,它似乎被卡住了一段时间(大约4分钟)。
我有一部华为5.0.1手机,这是我所能买到的最高的手机。 显然这不好。 但是,它没有在5.1星系S6上进行测试,因此可以正常工作。
根据Android文档,它不再适用于Android 5及更高版本。
API级别21中不推荐使用此方法。
功能已被删除,因为它不再有意义,并且具有两个以上的网络-我们需要一个数组来表达偏好。 相反,我们使用网络的动态网络属性来描述其优先级。
在Google某人身上找到了一个很好的明确答案:在Android上连接WIFI后如何通过移动网络保持连接?
(链接在上面的编辑信息中)
但是在实施之后,我得到了针对移动设备的网络回调,但是当我打开URL连接并执行请求时,在获得响应之前,它似乎被卡住了一段时间(大约4分钟)。
我有一部华为5.0.1手机,这是我所能买到的最高的手机。 显然这不好。 但是,它没有在5.1星系S6上进行测试,因此可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.