Wifi Connect-Disconnect Listener - PullRequest
       4

Wifi Connect-Disconnect Listener

51 голосов
/ 15 июня 2011

Какой слушатель должен в моем классе реализовать inorder для автоматической проверки кода, если 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");
}

Ответы [ 5 ]

75 голосов
/ 15 октября 2012

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

Вот как я слушаю фактические соединения Wi-Fi в моем Broadcast Receiver:

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>

РЕДАКТИРОВАТЬ: В Lollipop, планирование работы может помочь, если вы хотите выполнить действие, когда пользователь подключается к неизмеренному сетевому соединению.Взгляните: http://developer.android.com/about/versions/android-5.0.html#Power


РЕДАКТИРОВАТЬ 2: Другое соображение заключается в том, что мой ответ не проверяет, что у вас есть подключение к Интернету .Возможно, вы подключены к сети Wi-Fi, для которой требуется войти. Вот полезная проверка «IsOnline ()»: https://stackoverflow.com/a/27312494/1140744

18 голосов
/ 15 июня 2011

Создайте свой собственный класс, который расширяет 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 для объяснения использования Намерения.

14 голосов
/ 15 июня 2011

Проверьте эти две страницы 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>

РЕДАКТИРОВАТЬ:

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

3 голосов
/ 03 февраля 2015

В 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>
1 голос
/ 19 ноября 2016

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

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

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

...