Содержание
Часто нашим приложениям 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_.