Исправление ошибки `FileUriExposedException` при использовании `TTakePhotoFromCameraAction` в Delphi 10.1 Berlin для Android: применение FileProvider API
Исправление ошибки FileUriExposedException при использовании TTakePhotoFromCameraAction в Delphi 10.1 Berlin для Android: применение FileProvider API
Разработчики, работающие с мобильными приложениями на платформе Delphi, могут столкнуться с ошибкой FileUriExposedException при использовании стандартного действия TTakePhotoFromCameraAction в приложениях для Android, если целевая версия SDK установлена на 24 или выше. Эта проблема связана с изменениями в API Android, которые требуют использования FileProvider для безопасного обмена файлами между приложениями.
Описание проблемы
При использовании TTakePhotoFromCameraAction в приложениях Delphi для Android с установленной целевой версией SDK 24 или выше, может возникнуть ошибка android.os.FileUriExposedException. Это происходит из-за того, что начиная с Android 7.0 (API 24), система больше не поддерживает использование file:// URI для обмена файлами между приложениями. Вместо этого, необходимо использовать FileProvider, который обеспечивает безопасный механизм для предоставления доступа к файлам.
Подтвержденный ответ
Для решения проблемы необходимо интегрировать FileProvider в проект. Существует библиотека KastriFree на GitHub, которая предоставляет необходимые компоненты для работы с FileProvider в Delphi. Следует отметить, что разработчики Embarcadero уже осведомлены об этой проблеме и планируют внести соответствующие изменения в будущих обновлениях.
Шаги по интеграции FileProvider
Скачайте библиотеку KastriFree с GitHub и добавьте её в свой проект.
В вашем AndroidManifest.xml, добавьте элемент <provider> для FileProvider. Пример кода:
Измените логику TTakePhotoFromCameraAction, чтобы использовать FileProvider для сохранения и получения URI снимков. Пример изменения кода:
uses
Androidapi.JNIBridge, Androidapi.Helpers, Androidapi.PrivUtils;
type
TMyActivity = class(TActivity)
private
FPhotoUri: JString;
// ...
public
procedure TakePhoto;
// ...
end;
implementation
procedure TMyActivity.TakePhoto;
var
ContentUri: JString;
begin
ContentUri := TFileProvider.QueryContentUri(Context.PackageName, 'my_images', 'newpic.jpg');
with TTakePhotoFromCameraAction.Create(Self) do
try
PhotoURI := ContentUri;
// ...
ExecuteAction;
finally
Free;
end;
end;
Альтернативный ответ
Если по каким-то причинам интеграция FileProvider невозможна, можно обратиться в службу поддержки Embarcadero с просьбой о создании баг-репорта для исправления TTakePhotoFromCameraAction с целью поддержки API 24+.
Заключение
Использование FileProvider является ключевым решением для исправления ошибки FileUriExposedException в приложениях Delphi для Android, целевая версия SDK которых установлена на 24 или выше. Следуя инструкциям по интеграции FileProvider, разработчики смогут обеспечить корректную работу TTakePhotoFromCameraAction в соответствии с требованиями Android API.
Разработчики Delphi столкнулись с ошибкой `FileUriExposedException` при использовании `TTakePhotoFromCameraAction` в Android-приложениях на SDK 24 и выше и должны интегрировать `FileProvider` для корректной работы с файлами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.