2017-02-19 12 views
2

In meiner App verbinde ich mich mit einem Gerät, das über ein eigenes WiFi-Netzwerk verfügt. In Android 6 und höher fragt mich das System nach ein paar Sekunden, ob ich mich mit diesem Netzwerk verbinden möchte, obwohl keine Internetverbindung besteht. Erst nach Bestätigung dieser Nachricht kann ich mich mit meinem Gerät verbinden. Ich habe versucht, eine programmgesteuerte Verbindung mit dem Netzwerk herzustellen und den Benutzer nicht zu zwingen, zu seinen Einstellungen zu wechseln und jedes Mal manuell eine Verbindung herzustellen. Ich benutzte den folgenden Code in das Geräte-Netzwerk zu verbinden:Verwenden eines WiFi ohne Internetverbindung

private void connectToWiFi(WifiManager wifiManager, String wifiName) { 

    WifiConfiguration configuration = new WifiConfiguration(); 
    configuration.SSID = "\"" + wifiName + "\""; 
    configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
    wifiManager.addNetwork(configuration); 
    List<WifiConfiguration> list = wifiManager.getConfiguredNetworks(); 
    for (WifiConfiguration i : list) { 
     if (i.SSID != null && i.SSID.equals("\"" + wifiName + "\"")) { 
      wifiManager.disconnect(); 
      wifiManager.enableNetwork(i.networkId, true); 
      wifiManager.reconnect(); 
      break; 
     } 
    } 
} 

und auch die App zu erzwingen versucht, die WiFi-Verbindung zu verwenden und nicht die Handy-Daten Ich verwende:

NetworkRequest.Builder builder; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     builder = new NetworkRequest.Builder(); 
     builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 

     connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() { 
      @Override 
      public void onAvailable(Network network) { 
       String ssid = wifiManager.getConnectionInfo().getSSID(); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        connectivityManager.bindProcessToNetwork(null); 
        if (ssid.equals("\"" + Prefs.getWifiName(PUFMainActivity.this) + "\"")) { 
         connectivityManager.bindProcessToNetwork(network); 
         connectivityManager.unregisterNetworkCallback(this); 
        } 
       } 
      } 
     }); 

    } 

Obwohl so lange Da die Mobilfunkdaten aktiv sind, ist das Gerät nicht angeschlossen. Wenn ich die Cellular-Daten deaktiviere, funktioniert es gut. Ich muss wissen, ob es eine Möglichkeit gibt, programmgesteuert zu tun, was ich will, ohne dem Benutzer mitzuteilen, seine Cellular-Daten zu deaktivieren.

Dank

+0

Hallo @YYjo Haben Sie eine Antwort auf diese Frage? –

+0

@KenRatanachaiS. Leider nicht. Soweit ich das beurteilen kann funktioniert es bei Android einfach nicht gut. – YYJo

Antwort

1

zwar solange die Daten Cellular die Vorrichtung apear verbunden werden soll, nicht aktiv ist. Wenn ich die Cellular Daten deaktiviere, dann funktioniert es in Ordnung.

Ich war mit einem ähnlichen Problem konfrontiert. Die Standardlösung funktionierte nicht für mich, also verwendete ich die bindSocket Methode von Network Klasse, und anscheinend funktioniert es gerade gut. Ich weiß nicht, ob diese Lösung für Ihr Problem gilt, aber hier ist etwas Code:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
Network[] networks = connectivityManager.getAllNetworks(); 
for(Network network : networks){ 
    NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network); 

    if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI){ 
     wifiNetwork = network; // Grabbing the Network object for later usage 
    } 
} 

und nach dem Sockel:

if(android.os.Build.VERSION.SDK_INT >= 22) { 
    wifiNetwork.bindSocket(socket); 
} 

UPDATE: Sie können ein NetworkCallback verwenden das packen Network Objekt auch.

NetworkRequest.Builder builder; 
builder = new NetworkRequest.Builder(); 
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() { 
    @Override 
    public void onAvailable(Network network) { 
     wifiNetwork = network; 
    } 
}); 
Verwandte Themen