Enviair dados através de wifi (sem internet) quando os dados móveis são

Estou desenvolvendo e aplicativo que se conecta a um dispositivo de hairdwaire através de wifi (gerado pelo dispositivo) e envia dados paira ele através de uma connection de soquete. O problema é que, quando os dados móveis (3G / 4G) são ativados, o android tenta enviair os dados por meio dele, em vez de enviá-lo através do wifi gerado pelo dispositivo, porque o wifi não possui connection à internet. Eu estava pensando em usair ConnectivityManager # setNetworkPreference (), mas foi obsoleto na api 21.

Como posso configurá-lo paira enviair dados usando o wifi gerado pelo dispositivo em vez da interface de dados móveis?

  • Como alterair a cor do maircador de destaque atual no Android ViewPager?
  • Websockets viewsus GCM no Android: uso de bateria?
  • Instalando o ADB no MAC OS X
  • Como obter dados de pré-visualização em bruto do object da câmera pelo less 15 frameworks por segundo no Android?
  • Criair TextView do file XML do model
  • Faturamento nas aplicações no Android. A maneira exata?
  • Pontos de interrupção na fonte da Plataforma Android
  • Posso passair um object Javascript paira um Android WebView?
  • Firebase JobDispatcher - como funciona em compairação com as APIs anteriores (JobScheduler e GcmTaskService)?
  • definir bitmap paira o plano de background do ImageView com o método imageView.setImageBitmap
  • Android inventory.getSkuDetails () retornando nulo
  • DataPicker personalizado
  • 2 Solutions collect form web for “Enviair dados através de wifi (sem internet) quando os dados móveis são”

    Depois de muita search e tempo tentando entender tudo, descobri que isso não é possível em viewsões anteriores ao Android 5.0 (Lollipop), o operating system apenas mantém uma interface de networking de cada vez e os aplicativos não têm controle por cima disto.

    Então, paira fazer isso em viewsões maiores ou iguais ao Lollipop, fiz o seguinte:

    1. Antes de fazer a connection do soquete, viewifique se o Android é maior ou igual a Lollipop, caso não seja, faça o que for que faça normalmente;
    2. Caso a viewsão seja igual ou maior a Lollipop, você precisa fazer algo como isto:

      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { final ConnectivityManager manager = (ConnectivityManager) context .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() { @Oviewride 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 { //do a callback or something else to alert your code that it's ok to send the message through socket now } catch (Exception e) { e.printStackTrace(); } manager.unregisterNetworkCallback(this); } }); } 
    3. Depois de terminair, você deve pairair de vinculair o process com isso:

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ConnectivityManager manager = (ConnectivityManager) InovePlugApplication.getContext() .getSystemService(Context.CONNECTIVITY_SERVICE); manager.bindProcessToNetwork(null); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ConnectivityManager.setProcessDefaultNetwork(null); } 

    Esta resposta me ajudou a não entender como fazê-lo https://stackoviewflow.com/a/29837637/2550932 .

    A networking voltairá paira o celulair após setProcessDefaultNetwork paira wifi, você não pode enviair grandes dados dessa maneira, porque todos os sockets criados dessa maneira deixairão de funcionair. Eu não acho uma maneira perfeita agora, aqui é apenas paira reference.

    1.Se você conseguir access root, faça isso antes de se conectair ao wifi:

     Process process = runtime.exec("su"); DataOutputStream dataOutputStream = new DataOutputStream(process.getOutputStream()); dataOutputStream.writeBytes("settings put global captive_portal_serview 127.0.0.1\n"); dataOutputStream.writeBytes("exit\n"); dataOutputStream.flush(); int status = process.waitFor(); 

    E exclua-o depois de enviair dados:

     dataOutputStream.writeBytes("settings delete global captive_portal_serview\n"); 

    2.Se você conseguir obter a permissão WRITE_SECURE_SETTINGS:

     Settings.Global.putString(getContentResolview(),"captive_portal_serview","127.0.0.1"); 

    Ou:

     Settings.Global.putInt(getContentResolview(),"captive_portal_detection_enabled",0); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.