Delphi Firemonkey如何同时从相册中选择多张图片

11

我需要在我的Android应用程序中创建一个函数,允许用户打开电话库,一次选择多张图片,然后将所选图片保存在我的本地数据库中。 我需要的是使用Android Intent获取选定图片(文件名和路径)的方法。 希望你能理解我的问题。

我正在使用以下代码:

if TPlatformServices.Current.SupportsPlatformService(IFMXTakenImageService,
  IInterface(ImageService)) then
begin
  Params.RequiredResolution := TSize.Create(640, 640);
  Params.OnDidFinishTaking := DoDidFinish;
  ImageService.TakeImageFromLibrary(SpeedButton2, Params);
end;

procedure TfGallery.DoDidFinish(Image: TBitmap);
begin
 Image1.Bitmap.Assign(Image);
end;

很遗憾,这段代码只能从图库中返回一张图片。

编辑 - 基于Nick Cardoso的回答,以下代码已经解决了该问题的第一部分:

Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_PICK);
intent.setType(StringToJString('image/*'));
intent.setAction(TjIntent.JavaClass.ACTION_GET_CONTENT);
Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE,true);
LaunchActivity(Intent);

以上代码可用于选择多张图片。现在我卡住了,无法找到一种解决方案,在Delphi中以回调函数的形式返回已选文件!


1
你没有问题,只是在描述你想要做什么,就像伪代码一样,并且期望这里的人为你编写代码。因此,SO不是一个代码编写服务。做你的研究,尝试事情并编写代码,如果你被卡住了,那么关于特定的代码问题在这里提问。请参阅“如何提出好问题?”以获取有关如何提出SO问题的更多信息。 - Christos Lytras
@ChristosLytras 这里有一个用户问了和我一样的问题,请求代码! 我花了很多时间做研究,但是没有找到任何东西。 我只是尝试了一下,提问总是被允许的;如果你想回答就回答吧! 。 https://dev59.com/g2PVa4cB1Zd3GeqP7qMW - Gianluca Colombo
2
请阅读您所链接的问题中的第二条评论。这两个问题(您的问题和那个链接)实际上并没有询问如何解决特定的问题,而是描述了一个想要的程序行为/功能。请阅读如何提出好问题?。在这里,通过搜索“android open phone gallery”的谷歌结果,如何通过代码打开手机相册。所以对我来说,您根本没有进行任何搜索,只是来这里寻求有人为您完成工作并向他们提供赏金。 - Christos Lytras
请阅读开放悬赏中的评论:“我需要一个用Delphi编写的工作代码示例。”不幸的是,我不知道如何将Java转换为Pascal。无论如何,您发布的链接并不是我所需要的。我也可以打开画廊,但限制是我一次只能获取一张图片。 - Gianluca Colombo
你的目标安卓最低版本是多少? - Nick Cardoso
最低目标应该至少是 Android 18。 - Gianluca Colombo
1个回答

5
我先声明一下 - 我不写Delphi。你的问题是我第一次听说Firemonkey,我认为大多数Android开发者也是如此(因此回答率低)。
我的理解是,在幕后,Firemonkey会触发普通的Android Intent与标准组件进行交互。这意味着,如果我们可以将Intent切换到返回多个图像的Intent,那么我们就有了解决方案。
如果您只针对Android 18及以上版本进行定位,则只需将 EXTRA_ALLOW_MULTIPLE extra添加到现有的照片选择器Intent中即可。对于纯Android而言,只需添加以下内容,并读回剪贴板数据(如this answer中所述):
pickerIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE);

如果你的目标是旧版本的Android,你可以将一个自定义库(例如这个这些)包含到你的项目中,并使用新的意图来定位该活动。
我的研究表明,Firemonkey允许自定义操作,你需要自己研究如何实现它,因为你会更好地理解你所阅读的代码。
然而,这篇文章(看起来像是必读的)向我展示了创建自己的意图是可能的,这意味着你最初的操作内部的代码将类似于这样(如果你能找到当前TakeImageFromLibrary操作的源代码,你可以以此为基础编写你的代码):
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_PICK);
//OR Intent := TJIntent.JavaClass.init(StringToJString('com.some.library.client.SOME_ACTION'));
Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE);
LaunchActivity(Intent);

额外说明:在图库中选择多个文件的默认行为是长按


Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_PICK); intent.setType(StringToJString('image/*')); intent.setAction(TjIntent.JavaClass.ACTION_GET_CONTENT); Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE,true); LaunchActivity(Intent);以上代码可用于选择多张图片。现在我卡在了如何在 Delphi 中获取所选文件的解决方案! - Gianluca Colombo
你的回答对我有所帮助,但并不完全。 我仍然卡在寻找在Delphi中获取选定文件的解决方案上。 - Gianluca Colombo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接