Разработка под Android в .NET MAUI. Выбор файлов

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

Выбор файлов на устройстве Android

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

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

using Android.App;
using Android.Runtime;

[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage, MaxSdkVersion = 32)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadMediaAudio)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadMediaImages)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadMediaVideo)]

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

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

Если приложение .NET MAUI предназначено для Android 12 или более поздней версии, необходимо запросить разрешение READ_EXTERNAL_STORAGE, что мы и сделали в первом атрибуте, указав, при этом, свойство атрибута MaxSdkVersion = 32, что соответствует максимальной версии Android 12.1.

При этом, если приложение предназначено для Android 13 или более поздней версии и мы хотим получить доступ к файлам, созданным другими приложениями, то необходимо запросить следующие разрешение вместо READ_EXTERNAL_STORAGE:

  • READ_MEDIA_IMAGES — для получения доступа к изображениям
  • READ_MEDIA_VIDEO — для получения доступа к видеофайлам
  • READ_MEDIA_AUDIO — для получения доступа к аудиофайлам

Выбор медиафайлов в Android

Изменим код обработчика Clicked кнопки на странице MainPage следующим образом:

namespace MauiFiles
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private async void OnCounterClicked(object sender, EventArgs e)
        {
            await FilePicker.Default.PickAsync();
        }
    }

}

Здесь мы воспользовались реализацией по умолчанию интерфейса IFilePicker, которая доступна нам через свойство Default статического класса FilePicker и вызвали метод PickAsync(), который позволяет выбрать один файл на устройстве. Если запустить приложение и нажать кнопку, то откроется стандартное средство для выбора файлов на устройстве. Например, на моем смартфоне это средство выглядит так:Выбор файлов в .NET MAUIКак только вы выберите какой-нибудь файл, это средство закроется и вы вернетесь в интерфейс своего приложения. Метод PickAsync() возвращает объект типа FileResult. который содержит следующие свойства:

Свойство  Тип  Описание
ContentType string MIME-тип файла
FileName string Имя файла
FullPath string Полный путь к файлу

Также этот класс предоставляет нам метод:

public Task<System.IO.Stream> OpenReadAsync();

который открывает файл для чтения и возвращает в качестве результата поток, содержащий данные файла. Например, воспользовавшись свойством FullPath и (или) этим методом, мы можем открыть изображение в нашем приложении следующим образом:

public partial class MainPage : ContentPage
{

    public ImageSource Image { get; set; } 

    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnCounterClicked(object sender, EventArgs e)
    {
        var file = await FilePicker.Default.PickAsync();
        if (file != null)
        {
            if (file.FileName.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) ||
                file.FileName.EndsWith("png", StringComparison.OrdinalIgnoreCase))
            {
                var Image = ImageSource.FromFile(file.FullPath);
                ImageData.Source = Image;
            }
        }
    }
}

Здесь мы создаем новый объект типа ImageSource, используя полный путь к файлу:

var Image = ImageSource.FromFile(file.FullPath);

и передаем этот объект элементу с именем ImageData, который в XAML выглядит следующим образом:

<Image
    x:Name="ImageData" 
    HeightRequest="185"
    Aspect="AspectFit" />

Можете запустить приложение, выбрать какую-нибудь картинку и убедиться, что она загружается в приложении.

Выбор файлов по типу

Метод PickAsync() может принимать в качестве параметра объект типа PickOptions, который содержит следующие свойства:

Свойство Тип Описание
FileTypes FilePickerFileType Список типов файлов, которые должен возвращать средство выбора файлов. В Android файлы, не соответствующие этому списку, отображаются в окне выбора файлов, но будут неактивны и не могут быть выбраны. Для задания списка используются MIME-типы файлов.
Images PickOptions Предопределенный объект типа PickOptions, используемый для выбора только изображений
PickerTitle string? Заголовок, отображаемый в средстве выбора файлов. Используется только в Android и только для определенных типов файлов. Задание этого свойства не гарантирует, что в средстве выбора файлов будет отображаться именно ваш заголовок

Воспользуемся этим объектом и попробуем выбрать, например, только текстовые файлы. Изменим обработчик события Clicked следующим образом:

private async void OnCounterClicked(object sender, EventArgs e)
{
    var customFileType = new FilePickerFileType(
         new Dictionary<DevicePlatform, IEnumerable<string>>
         {
            { DevicePlatform.Android, new[] { "text/plain" } } // MIME type
         });
    PickOptions pickOptions = new PickOptions()
    {
        PickerTitle = "Выберите текстовые файлы",
        FileTypes = customFileType
    };
    var file = await FilePicker.Default.PickAsync(pickOptions);
}

Теперь запустите приложение и нажмите на кнопку. Вы увидите, что все файлы, не соответствующие MIME-типу, указанному в списке customFileType будут неактивны и выбрать их будет невозможно.

Кстати, перечень наиболее распространенных MIME-типов можно посмотреть вот здесь

Множественный выбор файлов

Для множественного выбора файлов у IFilePicker предназначен метод PickMultipleAsync(). Этот метод полностью аналогичен методу PickAsync(), которым мы уже пользовались, однако возвращает не один объект, а коллекцию IEnumerable<FileResult>. При множественном выборе файлов мы также можем задавать различные настройки выбора, включая и MIME-типы необходимых нам файлов.

Итого

Для выбора файлов в .NET MAUI используется одна из реализаций интерфейса IFilePicker. При вызове методов этого интерфейса на устройстве открывается стандартное средство выбора файлов в котором мы осуществляем выбор. Методы IFilePicker возвращают объекты типа FileResult, используя которые мы можем получить имя файла, его MIME-тип и полный путь к выбранному файлу.

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