В этой статье мы рассмотрим проблему доступа к файлам камеры в Android-приложениях, созданных с помощью Delphi и FireMonkey (FMX), и предложим несколько решений.
Проблема доступа к файлам камеры в Android
Как отмечали пользователи на форуме, при попытке получить список файлов из папки камеры Android (/storage/emulated/0/DCIM/Camera) с помощью стандартных методов Delphi FMX, таких как TDirectory.GetFiles(), возвращается пустой список, несмотря на то, что файлы существуют.
var
Files: TStringDynArray;
begin
Files := TDirectory.GetFiles('/storage/emulated/0/DCIM/Camera');
// Files будет пустым массивом
end;
Причины проблемы
Начиная с Android 10 (API 29), Google ввел новые ограничения на доступ к файлам, известные как Scoped Storage. Эти изменения ограничивают доступ приложений к файлам за пределами их собственного хранилища, если не используется специальный API.
Решение 1: Использование TPath.GetCameraPath
Первый вариант - использовать встроенный метод TPath.GetCameraPath:
var
CameraPath: string;
begin
CameraPath := TPath.GetCameraPath;
ShowMessage('Camera path: ' + CameraPath);
end;
Однако, как отмечали пользователи, этот метод может возвращать путь к папке камеры внутри хранилища приложения, а не к глобальной папке камеры.
Решение 2: Запрос разрешений
Для доступа к файлам камеры необходимо запросить соответствующие разрешения:
Как упомянул Dave Nottage, можно использовать библиотеки, такие как Kastri, которые уже реализуют необходимый функционал:
uses
KFI.Utils;
procedure GetFilesWithKastri;
var
Files: TStringDynamyArray;
begin
Files := KFI.Utils.GetExternalStorageFiles;
for var FilePath in Files do
ShowMessage(FilePath);
end;
Заключение
Доступ к файлам камеры в Android-приложениях, созданных с помощью Delphi FMX, требует особого подхода из-за ограничений Scoped Storage. Наиболее надежными решениями являются:
Использование ContentResolver для доступа к медиафайлам
Запрос соответствующих разрешений
Использование FileProvider для доступа к конкретным файлам
Применение специализированных библиотек, таких как Kastri
Выбор конкретного метода зависит от ваших требований и версии Android, на которую нацелено ваше приложение.
Обсуждаем Как правильно настроить Android-приложение для получения списка файлов с кассы в Delphi FMX: TPath.GetCameraPath, ContentResolver, FileProvider и Запрос разрешений
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS