Содержание
Часто нашим приложениям Android необходим доступ в Сеть, например, для отправки сообщений через мессенджер или для загрузки какой-либо информации и так далее. И прежде, че выполнять такие действия нам необходимо убедиться, что устройство имеет доступ в Сеть. Проверка сетевых подключений в Android осуществляется с использованием интерфейса IConnectivity
.
Определение необходимых разрешений
Для проверки сетевых подключений наше приложение должно иметь разрешение ACCESS_
, которое относится к группе обычных разрешений, поэтому достаточно добавить это разрешение любым из способов. Например, добавим разрешение в файл 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
предоставляет нам два свойства:
Свойство | Тип | Описание |
Connection |
IEnumerable<ConnectionProfile> |
Возвращает активные типы подключения для устройства. Перечисление ConnectionProfile может принимать следующие значения:
|
Network |
NetworkAccess |
Возвращает текущее состояние сетевого доступа. Перечисление NetworkAccess может принимать следующие значения:
|
а также одно событие:
Событие | Тип | Описание |
Connectivity |
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_
.