android - 如何在知道其 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%3A26674
。TMemoryStream.LoadFromFile
无法从这两个路径加载:
无法打开文件“/document/image:26724”。没有这样的文件或目录
无法打开文件“/content:/com.android.providers.media.documents/document/image%3A26724”。不是目录
因此问题是,我如何知道 Jnet_Uri 将文件内容加载到流中?
解决方案
我能够通过 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
推荐阅读
- architecture - NetWeight 和 GrossWeight 作为单独的值对象
- vue.js - Vuex 和 Vue-router:同时改变页面和状态
- c - C 中的内存泄漏 (MacOS)
- git - 如何按名称查找正在或曾经在远程分支中的文件?
- java - 用于postgres时间戳字段的Spring Jpa LessThanEqual
- java - Spring:无法使用选定字段查询存储库
- flutter - 固定错误:如何解决返回类型'StreamController
' 不是匿名闭包错误所定义的 'Stream' - java - javac无法在项目中导入类
- python - 如何将多行 JSON 字符串作为参数传递给 Python 脚本?
- flutter - 如果不支持颤振库,则忽略