2016-11-22 1 views
6

Ich verwende den folgenden Code, um eine Verbindung zu einem WiFi-Netzwerk ohne Internetverbindung herzustellen, da es seinen eigenen Webserver hostet, wo ich eine Verbindung herstellen möchte, auch wenn keine Internetverbindung verfügbar ist.Verbinden mit Wifi ohne Internet programmgesteuert

WifiConfiguration wifiConfiguration = new WifiConfiguration(); 
wifiConfiguration.SSID = String.format("\"%s\"", scanResult.SSID); 
wifiConfiguration.preSharedKey = String.format("\"%s\"", "secret"); 

int netId = wifiManager.addNetwork(wifiConfiguration) 
wifiManager.disconnect(); 
wifiManager.enableNetwork(netId, true); 
wifiManager.reconnect(); 

Dies funktioniert auf jedes Gerät unter Android Eibisch in Ordnung (ich bin mit CM13, so ist es vielleicht zu CyanogenMod verwendet?): Wenn ich diesen Code verwenden, um eine Verbindung, Android noch die mobile Verbindung verwendet und die Markierung WiFi-Symbol mit einem Ausrufezeichen. Sekunden später zeigt es eine Meldung mit der Frage, ob ich in Verbindung bleiben möchte, weil das Netzwerk keine Internetverbindung hat.

Problem: Meine App versucht automatisch eine Verbindung zu meinem Webserver herzustellen, die fehlschlägt, weil offensichtlich keine Internetverbindung besteht. Natürlich wäre es möglich zu warten, bis ich meinen Web-Server erreichen kann, aber es sollte ohne Benutzerinteraktion funktionieren.

Wie löst ChromeCast oder ein anderes IoT-Gerät dies? Ich habe nie eine Benachrichtigung wie diese gesehen, als ich mein ChromeCast-Gerät eingerichtet habe.

+0

Vielleicht möchten Sie die Lösung von @KodeMechanic in dieser [SO Beitrag] (http://stackoverflow.com/a/27370352), wobei er verwendet, um dieses Setup zu werfen aus PC, um versuchen eine zu Chrome mit Mobilfunkverbindung 'ChromeCast -> Lokaler Router -> PC mit PDANet -> USB verbinden mit Handy mit FoxFi App installiert'. – Teyam

+0

Außerdem sollten Sie in diesem [thread] (https://www.reddit.com/r/LifeProTips/comments/38sb3v/lpt_use_chromecast_without_internetmobile_data_by/crxfse8/) auch die Schritte zum Einrichten und Verwenden von Chromecast ohne Internetdaten überprüfen. Hoffe, dass das auch für dich funktioniert! – Teyam

+1

Chromecast ist hier nur ein Beispiel dafür, dass es funktioniert. Ich möchte einen benutzerdefinierten WLAN-Zugangspunkt ohne diese Nachricht implementieren, dass es keine Internetverbindung wie Chromecast gibt :) Es hat nichts genau mit Chromecast zu tun. – ForJ9

Antwort

6

Ich löste dies durch Bindung (connectivityManager.bindProcessToNetwork(network);) den aktuellen Prozess an das angeschlossene Netzwerk. Dies verhindert den Dialog "Dieses Netzwerk weiterhin verwenden" und ermöglicht die Kommunikation mit dem Gerät über WLAN.

NetworkRequest.Builder builder; 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    builder = new NetworkRequest.Builder(); 
    //set the transport type do WIFI 
    builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 

    connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() { 
     @Override 
     public void onAvailable(Network network) { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (Build.VERSION.RELEASE.equalsIgnoreCase("6.0")) { 
        if (!Settings.System.canWrite(mActivity)) { 
         Intent goToSettings = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); 
         goToSettings.setData(Uri.parse("package:" + mActivity.getPackageName())); 
         mActivity.startActivity(goToSettings); 
        } 
       } 
       connectivityManager.bindProcessToNetwork(null); 
       if (mSsid.contains("my_iot_device-xxxxxxxxx")) { 
        connectivityManager.bindProcessToNetwork(network); 
       } else { 

       } 

      } else { 
       //This method was deprecated in API level 23 
       ConnectivityManager.setProcessDefaultNetwork(null); 
       if (mSsid.contains("my_iot_device-xxxxxxxxx")) { 
        ConnectivityManager.setProcessDefaultNetwork(network); 
       } else { 

       } 

      } 
      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) { 
       Crashlytics.logException(e); 
       e.printStackTrace(); 
      } 
      connectivityManager.unregisterNetworkCallback(this); 
     } 
    }); 
} 
+0

Ich habe Probleme beim Herstellen der Verbindung selbst. [http://stackoverflow.com/questions/41712432/connecting-to-wifi-network-automatical-in-android-5-and-6](Siehe meine Frage) Irgendwelche Zeiger? – user2489122

+1

Warum wird "ACTION_MANAGE_WRITE_SETTINGS" benötigt? Warum ist es spezifisch für 6.0? – Easypeasy

+0

hat jemand versucht dies auf Android 8? –

Verwandte Themen