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
}
});
Обратите внимание, что слушатель удаляется после срабатывания обратного вызова, потому что он является статическим слушателем. Во всяком случае, эта реализация работает для меня и является одним из способов захвата вашей деятельности, или где-нибудь она статична.