Содержание
Выбор файлов в .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()
, который позволяет выбрать один файл на устройстве. Если запустить приложение и нажать кнопку, то откроется стандартное средство для выбора файлов на устройстве. Например, на моем смартфоне это средство выглядит так:Как только вы выберите какой-нибудь файл, это средство закроется и вы вернетесь в интерфейс своего приложения. Метод
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()
может принимать в качестве параметра объект типа Pick
, который содержит следующие свойства:
Свойство | Тип | Описание |
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
будут неактивны и выбрать их будет невозможно.
Множественный выбор файлов
Для множественного выбора файлов у IFilePicker
предназначен метод PickMultipleAsync()
. Этот метод полностью аналогичен методу PickAsync()
, которым мы уже пользовались, однако возвращает не один объект, а коллекцию IEnumerable<FileResult>
. При множественном выборе файлов мы также можем задавать различные настройки выбора, включая и MIME-типы необходимых нам файлов.
Итого
Для выбора файлов в .NET MAUI используется одна из реализаций интерфейса IFilePicker
. При вызове методов этого интерфейса на устройстве открывается стандартное средство выбора файлов в котором мы осуществляем выбор. Методы IFilePicker
возвращают объекты типа FileResult
, используя которые мы можем получить имя файла, его MIME-тип и полный путь к выбранному файлу.