Stas Posted January 8, 2020 Share Posted January 8, 2020 Здравствуйте Спасибо Quote Link to comment Share on other sites More sharing options...
Stas Posted January 9, 2020 Author Share Posted January 9, 2020 Так, диалог я вызвал, но как получить результат, мне непонятно, у FMX есть TFMXNativeActivityListener Что там у FGX пока неизвестно. Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 9, 2020 Administrators Share Posted January 9, 2020 В FGX Native в андроид реализации идет широковещательная рассылка двух сообщений (FGX.Platform.Android). На них (в соответствии с тем, что вам нужно) надо подписаться через System.Messaging: TfgActivityResultMessage = class(TMessage) public RequestCode: Integer; ResultCode: Integer; Data: TJIntent; end; TfgActivityNewIntentMessage = class(TMessage<TJIntent>); Quote Link to comment Share on other sites More sharing options...
Stas Posted January 9, 2020 Author Share Posted January 9, 2020 Спасибо, Ярослав, попробую Quote Link to comment Share on other sites More sharing options...
Stas Posted January 10, 2020 Author Share Posted January 10, 2020 (edited) Теперь следующий вопрос Вот так вызываю procedure TfgOpenDialog.Show(CallBack: TProc<TObject>); var Intent: TJIntent; begin FProc:=Proc; Intent:=TJIntent.Create; Intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); Intent.setAction(TJIntent.ACTION_GET_CONTENT); Intent.setType(StringToJString(MimeType)); TfgAndroidHelper.Activity.startActivityForResult(Intent,5); end; Вот так получаю procedure TfgOpenDialog.ResultCallback(const Sender: TObject; const M: TMessage); begin if TfgActivityResultMessage(M).RequestCode = 5 then if TfgActivityResultMessage(M).ResultCode = TJActivity.RESULT_OK then begin Jc:=TfgActivityResultMessage(M).Data.getClipData(); TfgDialogs.ShowMessage(IntToStr(Jc.getItemCount)); end; И вот тут вопрос, как получить один объект ? Т.е. где function getItemAt(&index : Integer) : JClipData_Item; cdecl; Спасибо З,Ы. Выложу как вылижу Edited January 10, 2020 by Stas Отформатировал код Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 10, 2020 Administrators Share Posted January 10, 2020 В релизе 1.0.3.0 в хедеры AndroidAPI добавлены оболочки для типа TJClipData_Item. Теперь эти методы будут доступны. 1 Quote Link to comment Share on other sites More sharing options...
Stas Posted January 10, 2020 Author Share Posted January 10, 2020 Фух, спасибо, я начал строить мосты, почище Крымского, и понимаю, что Вам это сделать гораздо проще Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 10, 2020 Administrators Share Posted January 10, 2020 Через часик релиз выложу. На будущее. Обертки для Android API я генерирую обычно по мере необходимости. Если в будущем вам будет чего-то не хватать в них, дайте мне знать. Я их сразу добавлю. В будущем будет доступна специальная тулза, которая генерирует эти хедеры. 1 Quote Link to comment Share on other sites More sharing options...
Stas Posted January 10, 2020 Author Share Posted January 10, 2020 (edited) Ярослав, спасибо, я уверен, что будет не хватать, я не буду ждать компонентов, но мосты... Кстати, от Вас, знаю, возможны, а к Вам ? Пример будет полезен. Edited January 10, 2020 by Stas Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 10, 2020 Administrators Share Posted January 10, 2020 3 минуты назад, Stas сказал: Кстати, от Вас, знаю, возможны, а к Вам ? Пример будет полезен. Ничего не понял. Quote Link to comment Share on other sites More sharing options...
Stas Posted January 10, 2020 Author Share Posted January 10, 2020 (edited) Каким образом Jnet_uri передать в TjUri (к примеру) Имеется в виду объекты FMX в FGX Edited January 10, 2020 by Stas Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 10, 2020 Administrators Share Posted January 10, 2020 34 минуты назад, Stas сказал: Каким образом Jnet_uri передать в TjUri (к примеру) Имеется в виду объекты FMX в FGX P.S. Не забываем про правила форума. Одна тема - один вопрос. Quote Link to comment Share on other sites More sharing options...
Stas Posted January 12, 2020 Author Share Posted January 12, 2020 (edited) Волобуев, вот вам меч. type TfgOpenDialog = class private FProc: TProc<boolean>; FMultiSelect: boolean; FFiles: TStrings; FMimeType: String; procedure ResultCallback(const Sender: TObject; const M: TMessage); procedure SetMultiSelect(const Value: boolean); procedure SetMimeType(const Value: String); public property Files:TStrings read FFiles; property MultiSelect:boolean read FMultiSelect write SetMultiSelect; property MimeType:String read FMimeType write SetMimeType; constructor Create; destructor Destroy; override; procedure Execute(Proc: TProc<boolean>); end; constructor TfgOpenDialog.Create; begin FFiles:=TStringList.Create; TMessageManager.DefaultManager.SubscribeToMessage(TfgActivityResultMessage, ResultCallback); end; destructor TfgOpenDialog.Destroy; begin TMessageManager.DefaultManager.Unsubscribe(TfgActivityResultMessage, ResultCallback); FFiles.Free; end; procedure TfgOpenDialog.ResultCallback(const Sender: TObject; const M: TMessage); var J:TJUri; function getFileName(Uri:TJUri):String; var c:JCursor; begin result:=''; if (uri.getScheme().equalsIgnoreCase(StringToJString('content'))) then begin c:=TfgAndroidHelper.Context.getContentResolver.query(uri,nil,nil,nil,nil); try if (c<>nil) and c.moveToFirst then result:=JStringToString(c.getString(c.getColumnIndex(StringToJString('_display_name') ) )) finally if (c<>nil) then c.close; end; end; if (result ='') then result:=JStringToString(uri.getPath()); end; procedure UriToFile(uri:TJUri); var i:integer; bt:byte; b:TJavaArray<Byte>; jis:TJInputStream; FilePath: string; ms:TMemoryStream; begin ms := TMemoryStream.Create; try jis := TfgAndroidHelper.Context.getContentResolver.openInputStream(uri); b := TJavaArray<Byte>.Create(jis.available); jis.read(b); for i:=0 to B.Length-1 do begin bt:=b.Items[i]; ms.Write(bt,1); end; jis.close; FilePath:=System.IOUtils.TPath.GetTempFileName+'.jpg'; ms.SaveToFile(FilePath); FFiles.Add(getFileName(uri)+'='+FilePath); finally ms.Free; end; end; var i:integer; begin if TfgActivityResultMessage(M).RequestCode = 42 then begin if TfgActivityResultMessage(M).ResultCode = TJActivity.RESULT_OK then begin if FMultiSelect then for I := 0 to TfgActivityResultMessage(M).Data.getClipData().getItemCount-1 do UriToFile(TfgActivityResultMessage(M).Data.getClipData().getItemAt(i).getUri) else UriToFile(TfgActivityResultMessage(M).Data.getData()); FProc(True); end else FProc(False) end; end; procedure TfgOpenDialog.SetMimeType(const Value: String); begin FMimeType := Value; end; procedure TfgOpenDialog.SetMultiSelect(const Value: boolean); begin FMultiSelect := Value; end; procedure TfgOpenDialog.Execute(Proc: TProc<boolean>); var Intent: TJIntent; begin FProc:=Proc; Intent:=TJIntent.Create; if FMultiSelect then Intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) else Intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false); Intent.setAction(TJIntent.ACTION_GET_CONTENT); Intent.setType(StringToJString(MimeType)); TfgAndroidHelper.Activity.startActivityForResult(Intent,42); end; Пример использования fg:=TfgOpenDialog.Create; fg.MimeType:='image/*'; fg.Execute(procedure(B:boolean) begin if B and (fg.Files.Count>0) then begin TfgAssetsManager.Current.AddBitmapFromFile(fg.Files.Names[0],fg.Files.ValueFromIndex[0]); fgImage1.ImageName:=fg.Files.Names[0]; fgLabel1.Text:=fgImage1.ImageName; end; fg:=nil; end) Спасибо, не пинайте за небрежность кода Edited January 12, 2020 by Stas 4 Quote Link to comment Share on other sites More sharing options...
Stas Posted September 15, 2020 Author Share Posted September 15, 2020 Здравствуйте, на всякий случай выкладываю исправленную версию диалогов Работает на 10.4 (проверял вроде) Просьба объявляйте переменную как интерфейс, и не забывайте присваивать nil по ненужности. Спасибо OpenDialog.7z 2 Quote Link to comment Share on other sites More sharing options...
Roman Posted July 6, 2022 Share Posted July 6, 2022 В 15.09.2020 в 18:37, Stas сказал: Здравствуйте, на всякий случай выкладываю исправленную версию диалогов Работает на 10.4 (проверял вроде) Просьба объявляйте переменную как интерфейс, и не забывайте присваивать nil по ненужности. Спасибо OpenDialog.7z 4 \u043a\u0411 · 19 загрузок Добрый день! Подскажите, пожалуйста, есть ли актуальная версия модуля для 10.4? Представленная здесь не стыкуется с текущей версией библиотеки ((( Quote Link to comment Share on other sites More sharing options...
Roman Posted July 7, 2022 Share Posted July 7, 2022 22 часа назад, Roman сказал: Добрый день! Подскажите, пожалуйста, есть ли актуальная версия модуля для 10.4? Представленная здесь не стыкуется с текущей версией библиотеки ((( Добрый день! Сам отвечу на свой запрос: все отлично работает при замене в секции uses FGX.OpenDialog.pas Android.Api.MediaStore на Android.Api.Providers.MediaStore Спасибо @Stas за модуль и @Yaroslav Brovin за подсказку 2 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.