06-03-2022, Saat: 17:08
Merhabalar. Mobil cihazda galeriden video seçip bu videoyu uygulamamda oynatmak istiyorum. TakePhotoFromLibraryAction gibi action olmadığı için java class'ları yazılması gerekiyor. Dosya seçme işlemi yapıyorum, fakat dosyanın yolunu çekemiyorum. Yardımcı olur musunuz?
unit Unit2; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation, System.Permissions, System.Messaging, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNI.App, FMX.Platform.Android, Androidapi.JNIBridge, FMX.StdActns, FMX.MediaLibrary.Actions, FMX.Media; type TForm2 = class(TForm) Label1: TLabel; Button1: TButton; MediaPlayerControl1: TMediaPlayerControl; MediaPlayer1: TMediaPlayer; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } // Handling Result : procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; function HandleIntentAction(const Data: JIntent): Boolean; end; var Form2: TForm2; fVideoFilename: string; FMessageSubscriptionID: integer; implementation {$R *.fmx} procedure TForm2.Button1Click(Sender: TObject); var chooserIntent, Intent: JIntent; ResultInt: integer; begin FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage (TMessageResultNotification, HandleActivityMessage); intent := TJIntent.Create; intent.setType(StringToJString('video/*')); intent.setAction(TJIntent.JavaClass.ACTION_GET_CONTENT); chooserIntent := TJIntent.JavaClass.createChooser(intent, StrToJCharSequence('Choose media file')); TAndroidHelper.Activity.startActivityForResult(chooserIntent, FMessageSubscriptionID); // SharedActivity.startActivityForResult(intent, 0); // SharedActivity.startActivityForResult(chooserIntent, 0); { var Intent: JIntent; begin FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage (TMessageResultNotification, HandleActivityMessage); Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_GET_CONTENT); Intent.setType(StringToJString('video/*')); Intent.setAction(TJIntent.JavaClass.ACTION_GET_CONTENT); //Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE, true); SharedActivity.startActivityForResult(Intent, 0); } end; procedure TForm2.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin // if M is TMessageResultNotification then // OnActivityResult(TMessageResultNotification(M).RequestCode, // TMessageResultNotification(M).ResultCode, // TMessageResultNotification(M).Value); if M is TMessageResultNotification then if HandleIntentAction(TMessageReceivedNotification(M).Value) then begin // A valid filename has been returned // Do The Videofile processing end; Label1.text := fVideoFilename; Timer1.Enabled := true; end; function TForm2.HandleIntentAction(const Data: JIntent): Boolean; var P: TJavaObjectArray<Jstring>; // in case you want only specific fields... not used here. I have passed nil to get all the columns. C: JCursor; I: integer; begin P := nil; // The following makes no difference // P:=TJavaObjectArray<Jstring>.create(1); // P.Items[0]:=StringToJstring('_data'); // this is suppose to give the information back to C ( : JCursor) C := TAndroidHelper.Activity.getContentResolver.query(Data.getData, nil, // when projection is nil... it returns all columns. Ideally, you should only ask for the columns you need StringToJString(''), // java accepts nil... but you cannot give nil here, you need to give an empty JString nil, StringToJString('')); // java accepts nil... but you cannot give nil here, you need to give an empty JString C.moveToFirst; Result := false; for I := 0 to C.getColumnCount - 1 do begin if JStringToString(C.getColumnName(I)) = '_data' then // '_data' column contains the path... you can use this to create the filestream to upload or do whatever.... begin // fVideoFilename is a field of the form fVideoFilename := JStringToString(C.getString(I)); Result := true; Break; end; end; if not Result then fVideoFilename := 'video file boş'; // P.Free; end; function TForm2.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; var filename: string; begin Result := false; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; Label1.text := ResultCode.ToString; Label1.text := Label1.text + slinebreak + RequestCode.ToString; if Assigned(Data) then begin // filename := JStringToString(Data.getStringExtra(StringToJString('RESULT'))); filename := JStringToString (Data.getStringExtra(TJIntent.JavaClass.EXTRA_TEXT)); ShowMessage('Result : ' + filename); Label1.text := Label1.text + slinebreak + filename; Label1.text := Label1.text + slinebreak + ' true'; end else begin Label1.text := Label1.text + slinebreak + ' false'; end; if RequestCode = TJActivity.JavaClass.RESULT_OK then begin if Assigned(Data) then begin // filename := JStringToString (Data.getStringExtra(StringToJString('RESULT'))); filename := JStringToString (Data.getStringExtra(TJIntent.JavaClass.EXTRA_TEXT)); ShowMessage('Result : ' + filename); Label1.text := Label1.text + slinebreak + filename; // memo1.Lines.Add(filename); end; end else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then begin ShowMessage('No'); end; Result := true; end; procedure TForm2.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; if FileExists(fVideoFilename) then begin MediaPlayer1.filename := fVideoFilename; MediaPlayer1.Play; end else begin ShowMessage('Dosya bulunamadı: ' + fVideoFilename); end; end; end.