5

Ich muss UDP-Pakete an ein WiFi-Modul (mit eigenem AP) ohne Internetverbindung senden, aber wenn ich das Handy anschließe Mit dem AP leitet Android meine Pakete auf der mobilen Datenschnittstelle um, weil es eine Internetverbindung hat.Senden Sie eine Anfrage über WiFi (ohne Verbindung), auch wenn Mobile Daten eingeschaltet ist (mit Verbindung) auf Android M

Ich habe den Code verwendet, um meine Arbeit zu tun, aber es scheint nicht funktioniert auf 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()); 
} 

Außerdem habe ich

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

auf meinem AndroidManifest.xml und ich stellte mich sicher, dass Settings.System.canWrite(this)true aber immer noch nichts zurückgibt.

Vielen Dank im Voraus.

+0

Mein Freund hat du darauf eine Lösung aus? Ich habe die genaue Anforderung. – AppleGrew

+0

Ich habe eine Problemumgehung gemacht, die eine Verbindung auf dem IoT-Gerät simuliert, damit Android denkt, dass das IoT-Gerät eine Verbindung hat. Sie können das tun, indem Sie eine ungültige Datei namens generate_204 auf dem Server-Root platzieren und einige URLs zu Ihren Server-DNS hinzufügen. Ich weiß, dass es eine seltsame Problemumgehung ist, aber für mich hat es funktioniert. Ich hoffe, ich habe dir geholfen. –

+0

Danke, aber das ist leider keine Option für mich. IoT-Gerät ist nicht in meiner Kontrolle. – AppleGrew

Antwort

2

Binden Sie das Netzwerk mit ConnectivityManager.setProcessDefaultNetwork() verhindert Roaming und ermöglicht den vollständigen TCP-Zugriff. Daher können Sie innerhalb des onAvailable() - Callbacks den Anwendungsprozess an dieses Netzwerk binden, anstatt eine Verbindung zu einer bestimmten URL zu öffnen.

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

Verwandte Themen