首页 > 解决方案 > 如何在知道其 Jnet_Uri 的 Android 上将文件加载到流中?

问题描述

我正在 Delphi 10.3 Rio 中编写一个 Android FMX 应用程序。在那里,我从图库中选择照片(通过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%3A26674TMemoryStream.LoadFromFile无法从这两个路径加载:

无法打开文件“/document/image:26724”。没有这样的文件或目录
无法打开文件“/content:/com.android.providers.media.documents/document/image%3A26724”。不是目录

因此问题是,我如何知道 Jnet_Uri 将文件内容加载到流中?

标签: androiddelphiurifiremonkeydelphi-10.3-rio

解决方案


我能够通过 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

推荐阅读