Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как правильно настроить Android-приложение для получения списка файлов с камеры в Delphi FMX?

Delphi , Программа и Интерфейс , Приложение своё

 

В этой статье мы рассмотрим проблему доступа к файлам камеры в 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: Запрос разрешений

Для доступа к файлам камеры необходимо запросить соответствующие разрешения:

  1. Добавьте в файл AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. Запросите разрешения во время выполнения:
uses
  Androidapi.Helpers, Androidapi.JNI.Os;

procedure RequestPermissions;
var
  Permissions: TArray<string>;
begin
  Permissions := [JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)];
  TAndroidHelper.Activity.requestPermissions(Permissions, 0);
end;

Решение 3: Использование ContentResolver

Для доступа к медиафайлам рекомендуется использовать ContentResolver:

uses
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Provider;

procedure GetCameraImages;
var
  Uri: Jnet_Uri;
  Cursor: JCursor;
  ColumnIndex: Integer;
  FilePath: string;
begin
  Uri := TJMediaStore_Images_Media.JavaClass.EXTERNAL_CONTENT_URI;
  Cursor := TAndroidHelper.Activity.getContentResolver.query(
    Uri,
    nil,
    nil,
    nil,
    nil);

  if Cursor <> nil then
  try
    ColumnIndex := Cursor.getColumnIndex(TJMediaStore_Images_Media.JavaClass.DATA);
    while Cursor.moveToNext do
    begin
      FilePath := JStringToString(Cursor.getString(ColumnIndex));
      if FilePath.Contains('DCIM/Camera') then
        ShowMessage('Found file: ' + FilePath);
    end;
  finally
    Cursor.close;
  end;
end;

Решение 4: Использование FileProvider

Для доступа к конкретным файлам можно использовать FileProvider:

  1. Добавьте в AndroidManifest.xml:
<provider
  android:name="androidx.core.content.FileProvider"
  android:authorities="com.your.package.fileprovider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />
</provider>
  1. Создайте файл res/xml/file_paths.xml:
<paths>
  <external-path name="external_files" path="." />
</paths>

Альтернативное решение: Использование библиотек

Как упомянул 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. Наиболее надежными решениями являются:

  1. Использование ContentResolver для доступа к медиафайлам
  2. Запрос соответствующих разрешений
  3. Использование FileProvider для доступа к конкретным файлам
  4. Применение специализированных библиотек, таких как Kastri

Выбор конкретного метода зависит от ваших требований и версии Android, на которую нацелено ваше приложение.

Создано по материалам из источника по ссылке.

Обсуждаем Как правильно настроить Android-приложение для получения списка файлов с кассы в Delphi FMX: TPath.GetCameraPath, ContentResolver, FileProvider и Запрос разрешений


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Приложение своё ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:10:19/0.0054750442504883/0