Как я могу получить эскизы видео с устройства android на платформе Delphi 10.3? - PullRequest
0 голосов
/ 02 мая 2020

В мобильном приложении, разработанном под Delphi 10.3, я хочу отобразить миниатюру видео, которое я выбираю из локального хранилища устройства. Может кто-нибудь поделиться примером кода, который делает это в Delphi.

Отредактировано в соответствии с предложением @Dave Nottage. Теперь все, что мне нужно, это получить абсолютный путь к выбранному видеофайлу.

procedure TForm1.OpenFileSelector(Sender: TObject; const APermissions: TArray<string>;
                                       const AGrantResults: TArray<TPermissionStatus>);

var
  Intent: JIntent;

begin
  FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification,
                                                                               HandleActivityMessage);
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_PICK);
  Intent.setType(StringToJString('video/*'));
  Intent.setAction(TjIntent.JavaClass.ACTION_GET_CONTENT);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE, true);
  Tandroidhelper.Activity.startActivityForResult(Intent,0);
  {$ENDIF}
end;
//-----------------------------

procedure TForm1.HandleActivityMessage(const Sender: TObject; const aMessage: TMessage);
// when message is received
begin
  if aMessage is TMessageResultNotification then
    HandleIntentAction(TMessageReceivedNotification(aMessage).Value);
end;

//-------------------------------------------
function TForm1.HandleIntentAction(const Data: JIntent): Boolean;
{code to get the details of the file selected from gallery}
  //============
  function LoadBitmapFromJBitmap(const ABitmap: TBitmap; const AJBitmap: JBitmap): Boolean;
  var
    LSurface: TBitmapSurface;
  begin
    LSurface := TBitmapSurface.Create;
    try
      Result := JBitmapToSurface(AJBitmap, LSurface);
      if Result then
        ABitmap.Assign(LSurface);
    finally
      LSurface.Free;
    end;
  end;
  //---------------
  procedure AssignVideoThumbnails(aPath: string);
  var
    LBitmap: JBitmap;
    LFileName: string;
  begin
   // LFileName := TPath.Combine(TPath.GetDocumentsPath, 'SampleVideo.mp4'); {using the paramter aPath instead}
    LBitmap := TJThumbnailUtils.JavaClass.createVideoThumbnail(StringToJString(aPath), TJImages_Thumbnails.JavaClass.MICRO_KIND); // 96 x 96
    if Assigned(LBitmap) then
      LoadBitmapFromJBitmap(Image1.Bitmap, LBitmap);
  end;
  //============
var
  vURI: JString;
  vFilePath: string;
begin
  if Assigned(Data) then begin
    vURI := Data.getData.getPath;        //getPath returns URI path
    vFilePath := ????                    // I NEED THE ABSOLUTE PATH of the selected file here
    AssignVideoThumbnails(vFilePath);    
  end;
end;

1 Ответ

0 голосов
/ 05 мая 2020

Вот пример:

uses
  System.IOUtils,
  Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Provider,
  FMX.Surfaces, FMX.Helpers.Android;

function LoadBitmapFromJBitmap(const ABitmap: TBitmap; const AJBitmap: JBitmap): Boolean;
var
  LSurface: TBitmapSurface;
begin
  LSurface := TBitmapSurface.Create;
  try
    Result := JBitmapToSurface(AJBitmap, LSurface);
    if Result then
      ABitmap.Assign(LSurface);
  finally
    LSurface.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  LBitmap: JBitmap;
  LFileName: string;
begin
  LFileName := TPath.Combine(TPath.GetDocumentsPath, 'SampleVideo.mp4');
  LBitmap := TJThumbnailUtils.JavaClass.createVideoThumbnail(StringToJString(LFileName), TJImages_Thumbnails.JavaClass.MICRO_KIND); // 96 x 96
  LoadBitmapFromJBitmap(Image1.Bitmap, LBitmap);
end;

Я развернул пример видео с помощью диспетчера развертывания на удаленном пути ./assets/internal, что в коде равно TPath.GetDocumentsPath.

LoadBitmapFromJBitmap делает в значительной степени то, что говорит: берет JBitmap и помещает его в TBitmap: -)

...