Как программно выполнять операции по сети для WiFi и сотовых данных отдельно, когда оба подключены в Android Studio? - PullRequest
1 голос
/ 08 января 2020

Это код, который используется для подключения к экрану с Wi-Fi по адресу 192.168.22.1. Он работает нормально, когда соединение с мобильными данными отключено, но не работает, если мобильные данные включены:

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();
        }
    }

Ответы [ 2 ]

1 голос
/ 08 января 2020

Возможно, потому что 192.168.22.1 является локальным адресом, поэтому он доступен только из локальной сети (wifi, ...). Если вы используете данные мобильного подключения, вы находитесь в паблике c inte rnet, поэтому вам понадобится NAT для этого локального адреса на адресный порт publi c.

Вы можете определить тип соединения используя:

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

Подробнее на Определить тип сетевого подключения на Android и о проблеме NAT: Получить преобразованный IP-адрес NAT и порт какого-либо локального порта и Как выставить мой локальный хост WWW? (переадресация порта?)

Если у вас оба активных соединения l oop для всех сетей от 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;
  }
}

См. Использование нескольких сетевых интерфейсов в приложении

0 голосов
/ 08 января 2020

Я нашел решение для этого и его работы, нам просто нужно изменить сетевой канал для передачи через Wi-Fi вместо мобильного inte rnet.

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);
                }
            });
        }
...