Delphi Firemonkey 同时从图库中选择多张图片

问题描述 投票:0回答:1

我需要在我的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 中选定的文件!

编辑 - 25/02/2024 以下代码是多次测试的结果。终于可以用了

procedure TfGallery.SelectImagesFromGallery;
var
  Intent: JIntent;
begin
  FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification,
    HandleActivityMessage);

  Intent := TJIntent.Create;
  Intent.setAction(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);
  TAndroidHelper.Activity.startActivityForResult(Intent, 0);

end;

procedure TfGallery.HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin

 // showmessage('HandleActivityMessage');

  if M is TMessageResultNotification then
    OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode,
      TMessageResultNotification(M).Value);
end;

function TfGallery.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
var
  ClipData: JClipData;
  ClipDataItemCount, I: Integer;
  ImagePaths: TArray<string>;
  Uri: Jnet_Uri;
begin
  Result := False;

  TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID);
  FMessageSubscriptionID := 0;


    if ResultCode = TJActivity.JavaClass.RESULT_OK then
    begin
      ClipData := Data.getClipData();
      if Assigned(ClipData) then
      begin
        ClipDataItemCount := ClipData.getItemCount();
        SetLength(ImagePaths, ClipDataItemCount);



        for I := 0 to ClipDataItemCount - 1 do
        begin
          Uri := ClipData.getItemAt(I).getUri();
          ImagePaths[I] := JStringToString(Uri.toString());
          showmessage('ImagePaths[I] = '+INTTOSTR(I) + ' -- '+ImagePaths[I]);
        end;

        // Ora ImagePaths contiene i percorsi delle immagini selezionate
        // Puoi procedere con l'elaborazione dei percorsi delle immagini come desiderato
        // ...
      end;
    end
    else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then
    begin
      Toast('You cancelled the scan', ShortToast);
    end;
    Result := True;

end;

用途:

procedure TfGallery.Button3Click(Sender: TObject);
begin
 SelectImagesFromGallery();
end;
android delphi firemonkey
1个回答
5
投票

我将从免责声明开始——我不写Delphi。你的问题是我第一次听说 Firemonkey,我预计大多数 Android 开发者也是如此(因此回答率很低)。

我的理解是,Firemonkey 在幕后触发普通 Android Intents 与标准组件交互。这意味着如果我们可以将意图切换为返回多个图像的意图,我们就有了一个解决方案。

如果您仅针对 Android 18 及更高版本,只需将

EXTRA_ALLOW_MULTIPLE
额外添加到现有照片选择器 Intent 中即可。使用纯 Android,只需添加以下内容并读回剪辑数据(如此答案中所示)即可:

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);

附加说明:在图库中选择多个的默认行为是长按

© www.soinside.com 2019 - 2024. All rights reserved.