IConnectivity — проверка сетевых подключений в Android

Часто нашим приложениям Android необходим доступ в Сеть, например, для отправки сообщений через мессенджер или для загрузки какой-либо информации и так далее. И прежде, че выполнять такие действия нам необходимо убедиться, что устройство имеет доступ в Сеть. Проверка сетевых подключений в Android осуществляется с использованием интерфейса IConnectivity.

Определение необходимых разрешений

Для проверки сетевых подключений наше приложение должно иметь разрешение ACCESS_NETWORK_STATE, которое относится к группе обычных разрешений, поэтому достаточно добавить это разрешение любым из способов. Например, добавим разрешение в файл Platforms/Android/MainApplication.cs

using Android.App;
using Android.Runtime;

[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)] //добавляем необходимое разрешение

namespace BlazorConnect
{
    [Application]
    public class MainApplication : MauiApplication
    {
        public MainApplication(IntPtr handle, JniHandleOwnership ownership)
            : base(handle, ownership)
        {
        }

        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}

Интерфейс IConnectivity и класс Connectivity

Интерфейс IConnectivity предоставляет нам два свойства:

Свойство Тип Описание
ConnectionProfiles IEnumerable<ConnectionProfile> Возвращает активные типы подключения для устройства. Перечисление ConnectionProfile может принимать следующие значения:

  • Unknown неизвестный тип подключения.
  • Bluetooth подключение по Bluetooth.
  • Cellular подключение к мобильной сети.
  • Ethernet подключение по ethernet.
  • WiFi подключение к Wi-Fi.
NetworkAccess NetworkAccess Возвращает текущее состояние сетевого доступа. Перечисление NetworkAccess может принимать следующие значения:

  • Unknown состояние подключения неизвестно.
  • None подключение отсутствует.
  • Local доступ только к локальной сети.
  • ConstrainedInternet ограниченный доступ к Интернету.
  • Internet локальный и интернет-доступ.

а также одно событие:

Событие Тип Описание
ConnectivityChanged EventHandler<ConnectivityChangedEventArgs> Происходит при изменении сетевого доступа или профиля.

Реализация этого интерфейса доступна нам с использованием свойства Current статического класса Connectivity

Проверка сетевых подключений в Android

Перепишем компонент Home нашего приложения следующим образом:

@page "/"
@implements IDisposable

<h1>Состояние подключения</h1>
<p>Сетевой доступ: @networkAccess</p>

<ul>
    @foreach (var profile in profiles)
    {
        <li>
            @profile
        </li>
    }
</ul>

@code{
    string networkAccess = "Подключено";
    List<string> profiles = [];

    protected override void OnInitialized()
    {
        Connectivity.ConnectivityChanged += ConnectivityChanged;
        ParseNetwork(Connectivity.NetworkAccess);
        ParseProfiles(Connectivity.ConnectionProfiles);
    }


    void ConnectivityChanged(object? sender, ConnectivityChangedEventArgs e)
    {
        ParseNetwork(e.NetworkAccess);
        ParseProfiles(e.ConnectionProfiles);
        StateHasChanged();
    }

    private void ParseNetwork(NetworkAccess access)
    {
        if (access == NetworkAccess.ConstrainedInternet)
            networkAccess = "Ограниченный доступ к сети";
        else
        if (access != NetworkAccess.Internet)
             networkAccess = "Подключение потеряно";
    }

    private void ParseProfiles(IEnumerable<ConnectionProfile> connectionProfiles)
    {
        profiles.Clear();
        foreach (var item in connectionProfiles)
        {
            switch (item)
            {
                case ConnectionProfile.Bluetooth:
                    profiles.Add("Bluetooth");
                    break;
                case ConnectionProfile.Cellular:
                    profiles.Add("Cell");
                    break;
                case ConnectionProfile.Ethernet:
                    profiles.Add("Ethernet");
                    break;
                case ConnectionProfile.WiFi:
                    profiles.Add("WiFi");
                    break;
                default:
                    break;
            }
        }
    }


    public void Dispose()
    {
        Connectivity.ConnectivityChanged -= ConnectivityChanged;
    }
}

Рассмотрим этот код подробно. Первое, на что необходимо обратить внимание — это на директиву Razor:

@implements IDisposable

которая означает, что класс нашего компонента реализует интерфейс IDisposable. Так мы используем в классе Connectivity подписку на событие ConnectivityChanged, то мы должны в методе Dispose() освободить ресурсы, что мы и делаем:

public void Dispose()
{
    Connectivity.ConnectivityChanged -= ConnectivityChanged;
}

Два вспомогательных метода — ParseProfiles() и ParseNetwork() используется для того, чтобы предоставить значения ConnectionProfile и NetworkAccess в виде строк. При инициализации компонента мы подписываемся на событие, а также сразу получаем значения для полей networkAccess и profiles 

protected override void OnInitialized()
{
    Connectivity.ConnectivityChanged += ConnectivityChanged;
    ParseNetwork(Connectivity.NetworkAccess);
    ParseProfiles(Connectivity.ConnectionProfiles);
}

В обработчике события ConnectivityChanged мы обновляем значения в полях и обновляем интерфейс:

void ConnectivityChanged(object? sender, ConnectivityChangedEventArgs e)
{
    ParseNetwork(e.NetworkAccess);
    ParseProfiles(e.ConnectionProfiles);
    StateHasChanged();
}

Можно запустить приложение и посмотреть на результат:

Итого

Проверка сетевых подключений в Android осуществляется с использованием интерфейса IConnectivity. Для получения состояния подключения к сети приложение должно иметь разрешение ACCESS_NETWORK_STATE.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии