Во многих проектах зачастую необходимо использовать wifi сеть для передачи данных. Это может быть как сбор информации с различных датчиков, так и передача данных между двумя различными телефонами.
В этой статье мы рассмотрим небольшой пример, как можно смотреть состояния включения/выключения сети. А также выясним, как программно подключиться к сети.
Для начале проведем некоторые подготовительные работы. Создадим пустой проект в Android Studio и создадим класс приложения.
public class App extends Application {
}
Пропишем его в манифесте
...
<application
android:allowBackup="true"
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
…
Итак, первым делом нам необходимо получить от нашей системы сигнал о том, что в системе произошли какие-то события, в нашем случае это включения и выключения WiFi.
Для этого нам необходим приемник таких сообщений. В android есть такой компонент как BroadcastReceiver. Он позволяет слушать внешние события и производить реакцию на них. Данный компонент начинает выполнять действия по получению Intent.
Нам необходимо создать класс и пронаследоваться от BroadcastReceiver, назовем его NetworkMonitor.
public class NetworkMonitor extends BroadcastReceiver { private String LOG_TAG = "myNetworkMonitor"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d(LOG_TAG, action); ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); Log.d(LOG_TAG,"isConnected: "+isConnected); if (!isConnected) return; boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; Log.d(LOG_TAG,"isWiFi: "+isWiFi); if (!isWiFi) return; WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo connectionInfo = wifiManager.getConnectionInfo(); Log.d(LOG_TAG,connectionInfo.getSSID()); } }
Теперь разберем, что здесь написано. Сначала мы получаем объект класса ConnectivityManager, который следит за состоянием сети и затем объект класса NetworkInfo для получения описания состояния сети. После этого проверяем: мы подключаемся или отключаемся. И затем проверяем если это Wifi или нет.
Отлично. Но как нам теперь его использовать? Для этого нам необходимо объект этого класса зарегистрировать в системе, используя фильтр Intent, в котором будем указывать, какие события нам необходимо получать.
В зависимости от задачи, мы можем регистрировать и отключать в любой момент. Давайте же его запустим при старте нашего приложения и отключим, когда наше приложения завершит свою работу.
Для этого вернемся в класс App и переопределим следующие методы:
private NetworkMonitor mNetworkMonitor;
@Override
public void onCreate() {
super.onCreate();
mNetworkMonitor = new NetworkMonitor();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkMonitor,intentFilter);
}
@Override
public void onTerminate() {
unregisterReceiver(mNetworkMonitor);
super.onTerminate();
}
Для того, чтобы наше приложение имело доступ к Wifi, пропишем сразу все разрешения которые нам понадобятся
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-feature android:name="android.hardware.wifi" />
Если запустить наше приложение и посмотреть на лог, то увидим, как мы ловим сигнал о включении и выключении сети.
Теперь наше приложения слушает события, но как нам просмотреть список сетей или подключиться к сети?
Для поиска сети нам необходимо пойти по такому же принципу.
Создаем класс и наследуемся от BroadcastReceiver:
private class ScanReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); List<ScanResult> scanResultList = wifi.getScanResults(); for (ScanResult scanResult : scanResultList) { Log.d(LOG_TAG,scanResult.toString()); } unregisterReceiver(this); } }
Мы находим все сети и просто выводим информацию по сетям.
Создадим кнопку, по нажатию которой будет производиться поиск.
btnFind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); scanReceiver = new ScanReceiver(); registerReceiver(scanReceiver , new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); wifi.startScan(); } });
Нажимая на кнопку, мы регистрируем наш объект и производим поиск.
Если запустим наше приложение, то увидим все доступные сети в радиусе.
В чледущей части мы расмотрим, как програмно переключатся между различными сетями из приложеня.
Комментарий (1)
Мансур
28 Мая 2016 в 12:04Спасибо. Где следующая часть?