连接到 WiFi 时强制在 android 上使用蜂窝网络连接
Force the use of the cellular connection on android while connected to WiFi
我有一个诊断设备,它也可以作为 Wifi 接入点。任何设备都可以连接到该接入点并从该设备请求信息。该设备显然不提供通过该网络的互联网访问。
我尝试创建一个 android 应用程序,它使用提供的 Wifi 网络从设备请求信息,然后使用蜂窝连接将数据上传到互联网上的某个服务器。
然而,Android 似乎在连接 Wifi 网络时停用蜂窝连接。由于wifi网络没有联网,无法上传数据,app也没用。
到目前为止,我尝试使用 ConnectivityManager
请求移动网络并将其绑定到我的通信套接字。此外,我尝试迭代所有网络接口并将通信套接字绑定到蜂窝接口的 IP 地址。但是,这两个请求都失败了,因为我无法从应用程序查询蜂窝网络接口。
我如何设法通过蜂窝互联网连接将数据从 Wifi 网络中的设备转发到某个服务器?
I filed a bug report for this issue.
该问题应在 Android 版本 5.1.0
中修复
这是正确的示例代码。
NetworkRequest cellularRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
if (connectivityManager != null) {
connectivityManager.requestNetwork(cellularRequest, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
// do request with the network
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.socketFactory(network.getSocketFactory());
OkHttpClient client = builder.build();
Call call = client.newCall(request);
Response response = call.execute();
// do remove callback. if you forget to remove it, you will received callback when cellular connect again.
connectivityManager.unregisterNetworkCallback(this);
}
@Override
public void onUnavailable() {
super.onUnavailable();
// do remove callback
connectivityManager.unregisterNetworkCallback(this);
}
});
}
我有一个诊断设备,它也可以作为 Wifi 接入点。任何设备都可以连接到该接入点并从该设备请求信息。该设备显然不提供通过该网络的互联网访问。
我尝试创建一个 android 应用程序,它使用提供的 Wifi 网络从设备请求信息,然后使用蜂窝连接将数据上传到互联网上的某个服务器。
然而,Android 似乎在连接 Wifi 网络时停用蜂窝连接。由于wifi网络没有联网,无法上传数据,app也没用。
到目前为止,我尝试使用 ConnectivityManager
请求移动网络并将其绑定到我的通信套接字。此外,我尝试迭代所有网络接口并将通信套接字绑定到蜂窝接口的 IP 地址。但是,这两个请求都失败了,因为我无法从应用程序查询蜂窝网络接口。
我如何设法通过蜂窝互联网连接将数据从 Wifi 网络中的设备转发到某个服务器?
I filed a bug report for this issue.
该问题应在 Android 版本 5.1.0
中修复这是正确的示例代码。
NetworkRequest cellularRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
if (connectivityManager != null) {
connectivityManager.requestNetwork(cellularRequest, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
// do request with the network
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.socketFactory(network.getSocketFactory());
OkHttpClient client = builder.build();
Call call = client.newCall(request);
Response response = call.execute();
// do remove callback. if you forget to remove it, you will received callback when cellular connect again.
connectivityManager.unregisterNetworkCallback(this);
}
@Override
public void onUnavailable() {
super.onUnavailable();
// do remove callback
connectivityManager.unregisterNetworkCallback(this);
}
});
}