Wifi Connect-Disconnect Listener

Какой слушатель должен выполнить мой класс, чтобы автоматически проверять код, если Wi-Fi соединяется/отключается?

Я могу вручную проверить подключение/отключение Wi-Fi, но каждый раз, когда мне нужно подключать/отключать WIFI из настроек Android, а затем запускать мою программу для результата.

Мой текущий код так же прост, как:

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

Ответ 1

На самом деле вы проверяете, включен ли Wi-Fi, что не обязательно означает, что он подключен. Это просто означает, что режим Wi-Fi на телефоне включен и может подключаться к сетям Wi-Fi.

Вот как я слушаю фактические подключения Wi-Fi в моем широковещательном приемнике:

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");    
    }   
};

Чтобы получить доступ к активной информации о сети, вам необходимо добавить следующие разрешения - на AndroidManifest.xml:

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

И следующий приемник намерений (или вы можете добавить это программно...)

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

EDIT: в Lollipop планирование заданий может помочь, если вы хотите выполнить действие, когда пользователь подключается к неконтролируемому сетевому соединению. Посмотрите: http://developer.android.com/about/versions/android-5.0.html#Power


EDIT 2: Еще одно соображение заключается в том, что мой ответ не проверяет, что у вас есть подключение к Интернету. Вы можете подключиться к сети Wi-Fi, в которой вам необходимо войти в систему. Здесь есть полезная проверка "IsOnline()": fooobar.com/questions/13922/...

Ответ 2

Создайте свой собственный класс, который расширяет BroadcastReceiver...

public class MyNetworkMonitor extends BroadcastReceiver {

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

        // Process the Intent here

    }
}

В 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>

Смотрите WIFI_STATE_CHANGED_ACTION и CONNECTIVITY_ACTION для объяснение использования намерения.

Ответ 3

Проверьте эти две страницы javadoc: ConnectivityManager WiFiManager

Обратите внимание, что каждый определяет действия трансляции. Если вам нужно больше узнать о регистрации широковещательных приемников, проверьте это: Программно зарегистрировать широковещательный приемник

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");
    }
  }
};

И в вашем манифесте вы можете сделать что-то подобное (если вы предпочитаете НЕ регистрировать приемник в коде):

<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:

Я должен добавить, что было бы лучше зарегистрировать этот широковещательный приемник в вашем коде, а не в манифесте, если вам нужно только получать трансляцию во время работы приложения. Указав это в манифесте, ваш процесс будет уведомлен об изменении соединения, даже если он еще не был запущен.

Ответ 4

В AndroidManifest.xml добавьте следующее разрешение.

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

Создайте новый класс получателя.

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();
        }
    }

И добавьте этот класс приемника в файл AndroidManifest.xml.

<receiver android:name="ConnectionChangeReceiver"
          android:label="NetworkConnection">
  <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>

Ответ 5

В ответ на сабсаб. Чтобы подключиться к ретранслятору трансляции связи, я использовал ответ warbi и добавил класс со статическими методами.

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;
    }
}

Затем я внес изменения в класс приемника по первому ответу, показанному выше.

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);
    }

}
}

Наконец, в вашей деятельности вы можете добавить слушателя для использования этого обратного вызова.

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
        }
    });

Обратите внимание, что слушатель удаляется после срабатывания обратного вызова, потому что он является статическим слушателем. Во всяком случае, эта реализация работает для меня и является одним из способов захвата вашей деятельности, или где-нибудь она статична.