Как загрузить файл в поток на Android, зная его Jnet_Uri? - PullRequest
3 голосов
/ 11 марта 2019

Я пишу приложение для Android FMX в Delphi 10.3 Rio.Там я выбираю фотографии из галереи (через TJIntent.JavaClass.ACTION_OPEN_DOCUMENT) и получаю обратно Jnet_Uri записей.Я могу использовать их для чтения изображения EXIF ​​(с TJExifInterface).Теперь мне также нужно загрузить эти изображения в поток для дальнейшей обработки.Как мне это сделать?

Когда я пытаюсь преобразовать Jnet_Uri в путь с uri.getPath, он выглядит как /document/image:26591.uri.toString дает мне content://com.android.providers.media.documents/document/image%3A26674.TMemoryStream.LoadFromFile не удается загрузить с обоих этих путей:

Невозможно открыть файл "/ document / image: 26724".Нет такого файла или каталога
Невозможно открыть файл "/content:/com.android.providers.media.documents/document/image%3A26724".Не каталог

Отсюда вопрос, как зная Jnet_Uri, я загружаю содержимое файлов в поток?

1 Ответ

4 голосов
/ 11 марта 2019

Мне удалось прочитать данные через JInputStream:

var
  uri: Jnet_Uri;
  ms: TMemoryStream;
  jis: JInputStream;
  b: TJavaArray<Byte>;
begin
  uri := .. some uri, alike "/document/image:26591"

  ms := TMemoryStream.Create;

  // Need to read via JInputStream, since Uri is not a file
  jis := TAndroidHelper.Context.getContentResolver.openInputStream(uri);
  b := TJavaArray<Byte>.Create(jis.available);
  jis.read(b);
  ms.Write(b.Data^, b.Length);
  jis.close;

   .. do something with Stream now
...