Содержание
Каждая операционная система, под которую мы можем разрабатывать приложения в Blazor Hybrid, имеет свои особенности и возможности. В этом разделе мы сосредоточимся на использовании возможностей операционной системы Android. Однако, прежде, чем мы перейдем к рассмотрению конкретных примеров, стоит рассмотреть наиболее общие моменты, связанные с разработкой под конкретные операционные системы.
Организация пространств имен в .NET MAUI
Когда мы разрабатываем кроссплатформенное приложение, то задействуем в работе .NET MAUI — платформу для разработки приложений под различные операционные системы. Как было сказано выше — каждая операционная система по-своему уникальна. Однако, можно выделить какие-либо общие функции и моменты, которые поддерживаются, если не всеми, то большинством платформ под которые мы можем разрабатывать приложение в .NET MAUI. Например, это могут быть возможности по работе с буфером обмена, открытие ссылок в браузере по умолчанию и так далее. Поэтому разработчики .NET MAUI постарались разделить все эти возможности и функции операционных систем на две группы:
- Возможности и функции, поддерживаемые в большинстве платформ
- Возможности и функции, характерные для конкретной платформы
Исходя из этого, в .NET MAUI используются пространства имен, в каждом из которых сосредоточены интерфейсы и реализующие их классы для работы с конкретными функциями и возможностями. Можно выделить следующие пространства имен, в которых содержаться интерфейсы и классы, которые мы можем использовать при разработке приложений Blazor Hybrid:
Microsoft.Maui.ApplicationModel
— здесь содержатся классы и интерфейсы для взаимодействия с главным потоком приложения, получения необходимых разрешений для приложения во время его выполнения, открытия ссылок в браузере и так далее.Microsoft.Maui.ApplicationModel.Communication
— здесь содержатся классы и интерфейсы для работы с контактами, электронной почтой, SMS, телефоном и так далее.Microsoft.Maui.Devices
— здесь содержатся классы и интерфейсы использования возможностей устройства — проверки заряда батареи, управления фонариком, получение сведений о геолокации, использование вибрации устройства и так далееMicrosoft.Maui.Media
— здесь содержатся классы и интерфейсы для выбора медиа-файлов, преобразования текста в речь, перевода физических величин из одних единиц измерения в другие и так далееMicrosoft.Maui.ApplicationModel.DataTransfer
— здесь содержатся классы и интерфейсы для работы с буфером обмена и предоставления общего доступа к файламMicrosoft.Maui.Storage
— здесь содержатся классы и интерфейсы для работы с различными хранилищами устройства, например, мы уже использовали классы из этого пространства имен для работы с хранилищем ключей и значений.
Организация работы с различными операционными системами
Схематично, организацию работы по использованию возможностей различных операционных систем можно представить следующим образом:
Например, для получения сведений о приложении в пространстве имен Microsoft.Maui.ApplicationModel
определен интерфейс IAppInfo
. У этого интерфейса определены свойства и методы, используя которые мы можем получить информацию о нашем приложении или открыть на устройстве страницу с параметрами. Этот интерфейс реализуется в статическом классе
public static class AppInfo
у которого определено статическое свойство:
public static IAppInfo Current { get; }
используя которое мы можем получить доступ к реализации по умолчанию свойств и методов интерфейса. У других интерфейсов статическое свойство может называться не Current
, а Default
, но сути это не меняет. Таким образом, чтобы организовать работу с конкретными возможностями операционной системы мы должны:
- подключить в проект необходимо пространство имен
- определить какой класс отвечает за работу
- получить доступ к свойству, которое реализует члены интерфейса по умолчанию
- вызвать необходимые методы, запросить значения свойств и так далее.
И, раз уж выше речь шла про информацию о приложении, то в качестве примера рассмотрим работу именно с этим интерфейсом.
Получение информации о приложении в Android
Создадим новое приложение Blazor Hybrid и изменим код компонента Home
следующим образом:
@page "/" @using Microsoft.Maui.ApplicationModel <h1>Информация о приложении</h1> <p>Версия @Info.Name</p> <p>Название @Info.Version</p> <p>Номер сборки @Info.BuildString</p> <p>Идентификатор пакета @Info.PackageName</p> <button class="btn btn-primary" @onclick="Click">Показать настройки</button> @code{ IAppInfo Info = AppInfo.Current; private void Click() { Info.ShowSettingsUI(); } }
Собственно, здесь мы и реализовали все пункты работы:
1. Подключили необходимое нам пространство имен
@using Microsoft.Maui.ApplicationModel
2. Определили класс для работы (AppInfo
) и получили значение свойства типа интерфейса для доступа к реализации членов интерфейса по умолчанию:
IAppInfo Info = AppInfo.Current;
3. Запросили значения необходимых свойств:
<p>Версия @Info.Name</p> <p>Название @Info.Version</p> <p>Номер сборки @Info.BuildString</p> <p>Идентификатор пакета @Info.PackageName</p>
а также вызвали метод интерфейса:
private void Click() { Info.ShowSettingsUI(); }
Теперь можно запустить приложение на устройстве Android или в эмуляторе и посмотреть на результат:
Клик по кнопке «Показать настройки» откроет системное окно «О приложении» (в Windows 10 откроется раздел настроек «Приложения и возможности»). По схожему алгоритму мы будем работать и с другими возможностями операционной системы Android.
Настройка разрешений приложения в Android
Доступ к некоторым возможностям Android может быть получен только после того как приложение запросит и получит необходимые разрешения. Например, мы не сможем воспользоваться геолокацией или фонариком на устройстве пока не получим необходимые разрешения. Приложение Blazor Hybrid может получать разрешения различными способами:
- Используя атрибуты сборки
- Используя манифест приложения
- Используя запрос разрешения при выполнении приложения.
Рассмотрим первые два способа установки разрешений на примере получения информации о заряде батареи устройства так как эти способы не подразумевают использования каких-либо специальных классов и мы можем ими воспользоваться уже сейчас. Для того, чтобы получить разрешение на работу с батареей в Android мы должны получить разрешение BatteryStats
. Чтобы продемонстрировать работу с разрешениями в Android допишем наше приложение следующим образом:
@page "/" @using Microsoft.Maui.ApplicationModel @using Microsoft.Maui.Devices <h1>Информация о приложении</h1> <p>Версия @Info.Name</p> <p>Название @Info.Version</p> <p>Номер сборки @Info.BuildString</p> <p>Идентификатор пакета @Info.PackageName</p> <p>Уровень заряда батареи: @(Accumulator.ChargeLevel*100)% </p> <button class="btn btn-primary" @onclick="Click">Показать настройки</button> @code{ IAppInfo Info = AppInfo.Current; IBattery Accumulator = Battery.Default; private void Click() { Info.ShowSettingsUI(); } }
Здесь мы добавили в проект пространство имен Microsoft.Maui.Devices для работы с возможностями устройства, получили доступ к API работы с батареей устройства:
IBattery Accumulator = Battery.Default;
И пытаемся вывести на экран информацию о заряде батареи в процентах:
<p>Уровень заряда батареи: @(Accumulator.ChargeLevel*100)% </p>
Если сейчас попытаться запустить приложение в Android то мы получим следующую ошибку:
Теперь рассмотрим все варианты получения разрешений для приложения.
Добавление разрешения с использованием атрибутов сборки
Для установки разрешения через атрибут сборки необходимо перейти в файл Platform/Android/MainApplication.cs и определить следующий атрибут
[assembly: UsesPermission(Android.Manifest.Permission.BatteryStats)]
сразу после директив using
. То есть файл должен выглядеть вот так:
using Android.App; using Android.Runtime; [assembly: UsesPermission(Android.Manifest.Permission.BatteryStats)] namespace BlazorAppInfo { [Application] public class MainApplication : MauiApplication { public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership) { } protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); } }
здесь UsesPermission
— это атрибут, устанавливающий разрешение, а Android.Manifest.Permission.BatteryStats
— строка, которая в данном случае, выглядит следующим образом:
android.permission.BATTERY_STATS
используя класс Permission
мы можем получить строки и для других разрешений в Android. Запустим приложение и убедимся, что заряд батареи отображается:
Использование манифеста приложения
Если по каким-то причинам вам неудобно/невозможно добавить необходимый атрибут с разрешением для приложения, то можно добавить это разрешение непосредственно в манифест. Манифест приложения — это специальный XML-файл, который размещается в папке для конкретной платформы:
В Visual Studio достаточно дважды кликнуть по этому файлу в обозревателе решений и откроется удобный редактор манифеста:
Нам достаточно перейти в раздел «Required permissions» и выбрать необходимое нам разрешение, после чего сохранить файл:
Результат выполнения этой операции будет тот же, что и в предыдущем случае — приложение получит необходимое разрешение и будет работать корректно.
Итого
Для разработки приложений Blazor Hybrid под Android мы задействуем возможности платформы .NET MAUI. Каждая операционная система имеет свои особенности и возможности работы, а для доступа к некоторым функциям требуется получение специальных разрешений. В Blazor Hybrid мы можем использовать несколько вариантов запроса разрешений.