Разработка Android приложения с использованием wifi сети

4.783 (6)

Во многих проектах зачастую необходимо использовать 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" />

Если запустить наше приложение и посмотреть на лог, то увидим, как мы ловим сигнал о включении и выключении сети.

Отслеживания состояния wifi сети  из android приложения

Теперь наше приложения слушает события, но как нам просмотреть список сетей или подключиться к сети?

Для поиска сети нам необходимо пойти по такому же принципу.

Создаем класс и наследуемся от 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();
    }
});

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

Если запустим наше приложение, то увидим все доступные сети в радиусе.

Поиск wifi сети из android приложения

В чледущей части мы расмотрим, как програмно переключатся между различными сетями из приложеня.

Комментарий (1)

Мансур

28 Мая 2016 в 12:04

Спасибо. Где следующая часть?

0/ 0
ответить

Войдите с помощью соцсетей:
или
введите свои данные: