it-swarm.com.de

Wifi Connect-Disconnect Listener

Welchen Listener muss meine Klasse implementieren, um automatisch den Code zu überprüfen, wenn die WLAN-Verbindung hergestellt/getrennt wird?

Ich kann manuell prüfen, ob eine WLAN-Verbindung besteht oder nicht, aber jedes Mal muss ich die WLAN-Verbindung über die Einstellungen von Android) herstellen/trennen und dann mein Programm ausführen, um das Ergebnis zu erhalten.

Mein aktueller Code ist so einfach wie:

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled()==true)
{
    tv.setText("You are connected");
}
else
{
    tv.setText("You are NOT connected");
}
51
Neha

Eigentlich prüfen Sie, ob WLAN aktiviert ist , was nicht unbedingt bedeutet, dass es verbunden ist . Dies bedeutet lediglich, dass der Wi-Fi-Modus auf dem Telefon aktiviert ist und eine Verbindung zu Wi-Fi-Netzwerken herstellen kann.

So lausche ich meinem Broadcast Receiver nach aktuellen Wi-Fi-Verbindungen:

public class WifiReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {     
        ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo netInfo = conMan.getActiveNetworkInfo();
        if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
            Log.d("WifiReceiver", "Have Wifi Connection");
        else
            Log.d("WifiReceiver", "Don't have Wifi Connection");    
    }   
};

Um auf die aktiven Netzwerkinformationen zugreifen zu können, müssen Sie Ihrem AndroidManifest.xml die folgenden Nutzungsrechte hinzufügen:

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

Und die folgende Absicht Empfänger (oder Sie könnten dies programmgesteuert hinzufügen ...)

<!-- Receive Wi-Fi connection state changes -->
<receiver Android:name=".WifiReceiver">
    <intent-filter>
        <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

BEARBEITEN: In Lollipop kann die Auftragsplanung hilfreich sein, wenn Sie eine Aktion ausführen möchten, wenn der Benutzer eine Verbindung zu einer nicht gemessenen Netzwerkverbindung herstellt. Schauen Sie sich das an: http://developer.Android.com/about/versions/Android-5.0.html#Power


EDIT 2: Eine andere Überlegung ist, dass meine Antwort nicht überprüft, ob Sie eine Verbindung zum Internet haben. Sie könnten mit einem Wi-Fi-Netzwerk verbunden sein, für das Sie sich anmelden müssen. Hier ist ein nützlicher "IsOnline ()" - Check: https://stackoverflow.com/a/27312494/1140744

75
warbi

Erstellen Sie Ihre eigene Klasse, die BroadcastReceiver erweitert ...

public class MyNetworkMonitor extends BroadcastReceiver {

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

        // Process the Intent here

    }
}

In AndroidManifest.xml

<receiver
    Android:name=".MyNetworkMonitor" >
        <intent-filter>
            <action Android:name="Android.net.wifi.STATE_CHANGE" />
            <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
</receiver>

Unter WIFI_STATE_CHANGED_ACTION und CONNECTIVITY_ACTION finden Sie eine Erklärung zur Verwendung der Absicht.

18
Squonk

Schauen Sie sich diese beiden Seiten von javadoc an: ConnectivityManagerWiFiManager

Beachten Sie, dass jeder Broadcast-Aktionen definiert. Wenn Sie mehr über das Registrieren von Rundfunkempfängern erfahren möchten, lesen Sie Folgendes: Programmgesteuertes Registrieren eines Rundfunkempfängers

BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (wifi.isWifiEnabled()) {
      tv.setText("You are connected");
    } else {
      tv.setText("You are NOT connected");
    }
  }
};

Und in Ihrem Manifest könnten Sie so etwas tun (wenn Sie es vorziehen würden, den Empfänger NICHT im Code zu registrieren):

<application Android:icon="@drawable/icon" Android:label="@string/app_name">
    <receiver Android:name=".WiFiReceiver" Android:enabled="true">
        <intent-filter>
            <action Android:name="Android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
        </intent-filter>
    </receiver>
</application>

EDIT:

Ich sollte hinzufügen, dass es besser ist, diesen Rundfunkempfänger in Ihrem Code als im Manifest zu registrieren, wenn Sie die Sendung nur empfangen müssen, während die App ausgeführt wird. Wenn Sie es im Manifest angeben, wird Ihr Prozess über eine Verbindungsänderung benachrichtigt, auch wenn diese zuvor nicht ausgeführt wurde.

14
Tanner Perrien

In AndroidManifest.xml folgende Berechtigung hinzufügen.

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

Neue Empfängerklasse erstellen.

public class ConnectionChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();

        if (activeNetInfo != null
            && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
            Toast.makeText(context, "Wifi Connected!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show();
        }
    }

Fügen Sie diese Empfängerklasse zur Datei AndroidManifest.xml hinzu.

<receiver Android:name="ConnectionChangeReceiver"
          Android:label="NetworkConnection">
  <intent-filter>
    <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>
3
Aung Thuya

Als Antwort auf Sabbab. Um den Connectivity Change-Rundfunkempfänger anzuschließen, habe ich die Antwort von warbi verwendet und eine Klasse mit statischen Methoden hinzugefügt.

public class WifiHelper
{
    private static boolean isConnectedToWifi;
    private static WifiConnectionChange sListener;

    public interface WifiConnectionChange {
        void wifiConnected(boolean connected);
    }

    /**
     * Only used by Connectivity_Change broadcast receiver
     * @param connected
     */
    public static void setWifiConnected(boolean connected) {
        isConnectedToWifi = connected;
        if (sListener!=null)
        {
            sListener.wifiConnected(connected);
            sListener = null;
        }
    }

    public static void setWifiListener(WifiConnectionChange listener) {
        sListener = listener;
    }
}

Dann habe ich bei der ersten oben gezeigten Antwort die Empfängerklasse geändert.

public class ConnectivityReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
    ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = conMan.getActiveNetworkInfo();
    if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI)
    {
        Log.d("WifiReceiver", "Have Wifi Connection");
        WifiHelper.setWifiConnected(true);
    } else
    {
        Log.d("WifiReceiver", "Don't have Wifi Connection");
        WifiHelper.setWifiConnected(false);
    }

}
}

Schließlich können Sie in Ihrer Aktivität einen Listener hinzufügen, um diesen Rückruf zu verwenden.

wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
wasWifiEnabled = (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING);
WifiHelper.setWifiListener(new WifiHelper.WifiConnectionChange()
    {
        @Override
        public void wifiConnected(boolean connected)
        {
            //Do logic here
        }
    });

Beachten Sie, dass der Listener nach dem Auslösen des Rückrufs entfernt wird, da er ein statischer Listener ist. Wie auch immer, diese Implementierung funktioniert für mich und ist eine Möglichkeit, sich in Ihre Aktivität einzuklinken, oder überall dort, wo sie statisch ist.

1
Danuofr