5

Devo inviare pacchetti UDP a un modulo WiFi (fornito con proprio AP) senza connessione Internet ma quando collego il cellulare con l'AP, Android reindirizza i miei pacchetti sull'interfaccia dati mobile perché ha una connessione Internet.Invia richiesta tramite WiFi (senza connessione) anche se i dati mobili sono ON (con connessione) su Android M

Ho usato il codice qui sotto per fare il mio lavoro, ma non sembra lavorare su Android M.

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private void setWifiInterfaceAsDefault() { 
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkRequest.Builder builder = new NetworkRequest.Builder(); 
    NetworkRequest networkRequest= builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) 
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 
      .build(); 

    connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback()); 
} 

Ho anche aggiunto

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 

sul mio AndroidManifest.xml e ho mi sono assicurato che Settings.System.canWrite(this) restituisce true ma ancora niente.

Grazie in anticipo.

+0

Il mio amico Hai capire una soluzione? Ho il requisito esatto. – AppleGrew

+0

Ho risolto il problema simulando una connessione sul dispositivo IoT per consentire a Android di pensare che il dispositivo IoT avesse una connessione. Puoi farlo inserendo un file void chiamato generate_204 nella root del server e aggiungendo alcuni URL al tuo server DNS. So che è una soluzione strana, ma per me ha funzionato. Spero di averti aiutato. –

+0

Grazie, ma sfortunatamente non è un'opzione per me. Il dispositivo IoT non è nel mio controllo. – AppleGrew

risposta

2

Unire la rete utilizzando ConnectivityManager.setProcessDefaultNetwork() impedisce il roaming e consente l'accesso TCP completo. Pertanto, all'interno del callback onAvailable() è possibile associare il processo dell'applicazione a quella rete anziché aprire una connessione a un URL specifico.

ConnectivityManager connection_manager = 
(ConnectivityManager) activity.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE); 

NetworkRequest.Builder request = new NetworkRequest.Builder(); 
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 

connection_manager.registerNetworkCallback(request.build(), new NetworkCallback() { 

    @Override 
    public void onAvailable(Network network) { 
     ConnectivityManager.setProcessDefaultNetwork(network); 
    } 
} 

Original answer

Problemi correlati