如何将文件加载到 Android 上的流中并知道其 Jnet_Uri?
How to load a file into a stream on Android knowing its Jnet_Uri?
我正在 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
无法从这两个路径加载:
Cannot open file "/document/image:26724". No such file or directory
Cannot open file "/content:/com.android.providers.media.documents/document/image%3A26724". Not a directory
因此问题来了,我如何知道 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
我正在 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
无法从这两个路径加载:
Cannot open file "/document/image:26724". No such file or directory
Cannot open file "/content:/com.android.providers.media.documents/document/image%3A26724". Not a directory
因此问题来了,我如何知道 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