当 WiFi 和蜂窝数据在 Android Studio 中连接时,如何以编程方式分别执行网络操作?



这是用于连接到地址192.168.22.1上带有wifi的屏幕的代码。 在关闭移动数据的情况下连接时,它工作正常,但如果移动数据处于打开状态,则无法正常工作:

public void onConnectClicked(View view){
Y2Screen screen = new Y2Screen("http://192.168.22.1");
final TextView message=findViewById(R.id.mess);
try {
message.setText("Connecting....");
if (!screen.login("guest", "guest")) {
message.setText("Connection Failed");
} else {
message.setText("Done Loging.");
//VideoArea va = new VideoArea(0, 0, screen.getWidth(), screen.getHeight());
PicArea pa=new PicArea(0, 0, screen.getWidth(), screen.getHeight());

File dir = Environment.getExternalStorageDirectory();
String path = dir.getAbsolutePath();

//va.addVideo(path+"/glomo/image.jpeg", 100);
pa.addPage(path+"/glomo/test3.png","PNG");
ProgramPlayFile prog = new ProgramPlayFile(1);
prog.getAreas().add(pa);
String listId = screen.writePlaylist(new ProgramPlayFile[]{prog});
screen.play(listId);
}
} catch (Y2Exception e) {
e.printStackTrace();
}
}

可能是因为 192.168.22.1 是本地地址,所以只能从本地网络(wifi 等(访问。如果您使用的是移动连接数据,则您在公共互联网上,因此您需要将该本地地址NAT到公共地址端口。

您可以使用以下方法检测连接类型:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();

有关详细信息,请参阅在 Android 上检测网络连接类型和关于 NAT 问题:获取某些本地端口的 NAT 转换 IP 和端口以及如何向 WWW 公开我的本地主机?(端口转发?

如果您有两个连接都处于活动状态,则从connectivityManager.getAllNetworks((循环所有网络,并使用connectivityManager.bindProcessToNetwork(network(选择一个;

for (Network network : connectivityManager.getAllNetworks()) {
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET || networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
connectivityManager.bindProcessToNetwork(network);
break;
}
}

请参阅在应用中使用多个网络接口

我为此找到了解决方案及其工作原理,我们只需要更改网络通道即可通过wifi而不是移动互联网进行传输。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
final ConnectivityManager manager = (ConnectivityManager) MainActivity.this
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder;
builder = new NetworkRequest.Builder();
//set the transport type do WIFI
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
manager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
manager.bindProcessToNetwork(network);
} else {
//This method was deprecated in API level 23
ConnectivityManager.setProcessDefaultNetwork(network);
}
try {
} catch (Exception e) {
e.printStackTrace();
}
manager.unregisterNetworkCallback(this);
}
});
}

最新更新