149 Stimmen

Wie kann man erkennen, wann eine WIFI-Verbindung in Android hergestellt wurde?

Ich muss erkennen, wann ich eine Netzwerkverbindung über WIFI habe. Welcher Broadcast wird gesendet, um festzustellen, dass eine gültige Netzwerkverbindung hergestellt wurde? Ich muss überprüfen, ob eine gültige Netzwerkverbindung für HTTP besteht. Worauf sollte ich achten und welche zusätzlichen Tests muss ich durchführen, um zu wissen, dass eine gültige Verbindung besteht.

0 Stimmen

Ein Teil dieser Frage wurde bereits hier beantwortet, wie ich fand: stackoverflow.com/questions/4238921/

1 Stimmen

Es stellt sich aber immer noch die Frage, WANN diese Bedingungen überprüft werden sollen.

1 Stimmen

Ich würde gerne wissen, ob es Sendungen gibt, die von einem Rundfunkempfänger aufgefangen werden können?

130voto

jpm Punkte 2902

Sie können eine BroadcastReceiver um benachrichtigt zu werden, wenn eine WiFi-Verbindung hergestellt wird (oder wenn sich die Verbindung ändert).

Registrieren Sie die BroadcastReceiver :

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
registerReceiver(broadcastReceiver, intentFilter);

Und dann in Ihrem BroadcastReceiver machen Sie etwas in der Art:

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
        if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
            //do stuff
        } else {
            // wifi connection was lost
        }
    }
}

Weitere Informationen finden Sie in der Dokumentation zu BroadcastReceiver y WifiManager

Natürlich sollten Sie vorher prüfen, ob das Gerät bereits mit dem WiFi verbunden ist.

EDIT: Dank ban-geoengineering gibt es jetzt eine Methode, um zu prüfen, ob das Gerät bereits verbunden ist:

private boolean isConnectedViaWifi() {
     ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
     return mWifi.isConnected();
}

1 Stimmen

Warum SUPPLICANT_CONECTION_CHANGE_ACTION? Ich dachte, es sei JUST CONNECTION_CHANGE change broadcast. Warum SUPPLCANT??? danke

2 Stimmen

Hm? Ich sehe keine Aktion namens connection_change...? Ich sehe nur, dass der WiFi-Status geändert wurde, aber diese Aktion zeigt nur an, ob das WiFi aktiviert ist oder nicht (oder aktiviert/deaktiviert), nicht ob es verbunden ist... tut supplicant_connection_change_action nicht das, was Sie brauchen?

9 Stimmen

Bei mir funktioniert WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION nicht, wenn die Verbindung zu einer bekannten Wifi-Station hergestellt/verloren wurde. Aber WifiManager.NETWORK_STATE_CHANGED_ACTION funktioniert.

107voto

M. Usman Khan Punkte 4242

Das Beste, was für mich funktioniert hat:

AndroidManifest

<receiver android:name="com.AEDesign.communication.WifiReceiver" >
   <intent-filter android:priority="100">
      <action android:name="android.net.wifi.STATE_CHANGE" />
   </intent-filter>
</receiver>

BroadcastReceiver-Klasse

public class WifiReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {

      NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
      if(info != null && info.isConnected()) {
        // Do your work. 

        // e.g. To check the Network Name or other info:
        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        String ssid = wifiInfo.getSSID();
      }
   }
}

Berechtigungen

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1 Stimmen

Ich denke, das ist die beste Antwort auf die Frage nach der Änderung des Wifi-Status. Danke

4 Stimmen

Für eine spätere einfache Referenz lautet diese fest kodierte Aktion WifiManager.NETWORK_STATE_CHANGED_ACTION .

3 Stimmen

If (info != null && info.isConnected()) = keine Spaghetti.

18voto

Yar Punkte 4453

Nur für mich WifiManager.NETWORK_STATE_CHANGED_ACTION funktioniert.

Registrieren Sie einen Rundfunkempfänger:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(broadcastReceiver, intentFilter);

und erhalten:

@Override
public void onReceive(Context context, Intent intent) {

    final String action = intent.getAction();

    if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
        NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        boolean connected = info.isConnected();

        //call your method
    }      
}

1 Stimmen

Auch bei mir hat nur WifiManager.NETWORK_STATE_CHANGED_ACTION funktioniert, gibt es eine Erklärung dafür, warum nur dies funktioniert?

10voto

Yog Guru Punkte 2139

Die Antworten der Benutzer @JPM und @usman sind wirklich sehr nützlich. Es funktioniert gut, aber in meinem Fall kommt es in onReceive in meinem Fall mehrere Male 4 Mal damit mein Code mehrfach ausgeführt wird.

Ich tue einige Änderungen und machen nach meinen Anforderungen und jetzt kommt es nur 1 Mal

Hier ist die Java-Klasse für Broadcast.

public class WifiReceiver extends BroadcastReceiver {

String TAG = getClass().getSimpleName();
private Context mContext;

@Override
public void onReceive(Context context, Intent intent) {

    mContext = context;

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
                networkInfo.isConnected()) {
            // Wifi is connected
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            String ssid = wifiInfo.getSSID();

            Log.e(TAG, " -- Wifi connected --- " + " SSID " + ssid );

        }
    }
    else if (intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION))
    {
        int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
        if (wifiState == WifiManager.WIFI_STATE_DISABLED)
        {
            Log.e(TAG, " ----- Wifi  Disconnected ----- ");
        }

    }
}
}

In AndroidManifest

<receiver android:name=".util.WifiReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1 Stimmen

Was ist wifiState?

1 Stimmen

Möchte auch wissen, was wifiState ist, wie es erzeugt wurde

1 Stimmen

@behelit jetzt ist "wifiState" in der bearbeiteten Antwort vorhanden.

10voto

user1445716 Punkte 442

Sie peut eine WLAN-Verbindung zu starten, wenn Sie dem Benutzer die Möglichkeit geben, das normale Verhalten, jedes Mal nachzufragen, außer Kraft zu setzen.

Ich habe mich für drei Methoden entschieden...

public boolean isOnline() 
{
 ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
 return (networkInfo != null && networkInfo.isConnected());
}  

Dies ist eine schnelle Überprüfung, ob eine Internetverbindung besteht, entweder über Wifi oder CellData. Von hier aus können Sie wählen, welche Maßnahmen Sie ergreifen möchten. Ist es im Flugzeugmodus muss auch überprüft werden.

In einem anderen Thema. Ich setze eine Variable IpAddress auf = " " und frage ab, bis ich eine gültige IP-Adresse habe.

  WifiManager wifi;
  wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
  WifiInfo wifiInfo = wifi.getConnectionInfo();
  int ipAddress = wifiInfo.getIpAddress();
  String ip = null;
  ip = String.format("%d.%d.%d.%d",
  (ipAddress & 0xff),
  (ipAddress >> 8 & 0xff),
  (ipAddress >> 16 & 0xff),
  (ipAddress >> 24 & 0xff));
  Log.e(" >>IP number Begin ",ip);

Ein weiterer Codeschnipsel... Wenn es nicht eingeschaltet ist, schalten Sie es ein (mit vorheriger Genehmigung des Benutzers)

   if(wifi.isWifiEnabled()!=true)wifi.setWifiEnabled(true);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X