Blazor Hybrid — разработка под Android

Каждая операционная система, под которую мы можем разрабатывать приложения в Blazor Hybrid, имеет свои особенности и возможности. В этом разделе мы сосредоточимся на использовании возможностей операционной системы Android. Однако, прежде, чем мы перейдем к рассмотрению конкретных примеров, стоит рассмотреть наиболее общие моменты, связанные с разработкой под конкретные операционные системы.

Организация пространств имен в .NET MAUI

Когда мы разрабатываем кроссплатформенное приложение, то задействуем в работе .NET MAUI — платформу для разработки приложений под различные операционные системы. Как было сказано выше — каждая операционная система по-своему уникальна. Однако, можно выделить какие-либо общие функции и моменты, которые поддерживаются, если не всеми, то большинством платформ под которые мы можем разрабатывать приложение в .NET MAUI. Например, это могут быть возможности по работе с буфером обмена, открытие ссылок в браузере по умолчанию и так далее. Поэтому разработчики .NET MAUI постарались разделить все эти возможности и функции операционных систем на две группы:

  1. Возможности и функции, поддерживаемые в большинстве платформ
  2. Возможности и функции, характерные для конкретной платформы

Исходя из этого, в .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, но сути это не меняет. Таким образом, чтобы организовать работу с конкретными возможностями операционной системы мы должны:

  1. подключить в проект необходимо пространство имен
  2. определить какой класс отвечает за работу
  3. получить доступ к свойству, которое реализует члены интерфейса по умолчанию
  4. вызвать необходимые методы, запросить значения свойств и так далее.

И, раз уж выше речь шла про информацию о приложении, то в качестве примера рассмотрим работу именно с этим интерфейсом.

Получение информации о приложении в 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 может получать разрешения различными способами:

  1. Используя атрибуты сборки
  2. Используя манифест приложения
  3. Используя запрос разрешения при выполнении приложения.

Рассмотрим первые два способа установки разрешений на примере получения информации о заряде батареи устройства так как эти способы не подразумевают использования каких-либо специальных классов и мы можем ими воспользоваться уже сейчас. Для того, чтобы получить разрешение на работу с батареей в 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 то мы получим следующую ошибку:

[chromium] [INFO:CONSOLE(1)] «You need to declare using the permission: `android.permission.BATTERY_STATS` in your AndroidManifest.xml 

Теперь рассмотрим все варианты получения разрешений для приложения.

Добавление разрешения с использованием атрибутов сборки

Для установки разрешения через атрибут сборки необходимо перейти в файл 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 мы можем использовать несколько вариантов запроса разрешений.

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