Unit1.pas 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. unit Unit1;
  2. interface
  3. uses
  4. System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  5. FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  6. FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;
  7. type
  8. TForm1 = class(TForm)
  9. mmo1: TMemo;
  10. btn1: TButton;
  11. btn2: TButton;
  12. Button1: TButton;
  13. procedure btn2Click(Sender: TObject);
  14. procedure btn1Click(Sender: TObject);
  15. procedure Button1Click(Sender: TObject);
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21. var
  22. Form1: TForm1;
  23. implementation
  24. {$R *.fmx}
  25. uses
  26. {$IFDEF ANDROID}
  27. Androidapi.JNI.GraphicsContentViewText,
  28. Androidapi.JNI.JavaTypes, Androidapi.JNI.App, Androidapi.JNI.Net,
  29. Androidapi.Helpers, ksAndroid.Helpers,
  30. {$ENDIF}
  31. System.Messaging;
  32. type
  33. TOpenFileCallback = reference to procedure(const ACode: Integer; const APath: string);
  34. TOpenFileEvent = procedure (const ACode: Integer; const APath: string) of object;
  35. const
  36. FILE_SELECT_CODE = 0;
  37. var
  38. FMessageChooserID: Integer = 0;
  39. FOpenFileCallback: TOpenFileCallback;
  40. FOpenFileEvent: TOpenFileEvent;
  41. FAction: JString;
  42. procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
  43. var
  44. LCode: Integer;
  45. FileName:string;
  46. URI: Jnet_Uri;
  47. begin
  48. if (not Assigned(M)) or (not (M is TMessageResultNotification))
  49. or (TMessageResultNotification(M).RequestCode <> FILE_SELECT_CODE) then
  50. Exit;
  51. LCode := TMessageResultNotification(M).ResultCode;
  52. FileName := '';
  53. {$IFDEF DEBUG}
  54. if LCode = TJActivity.JavaClass.RESULT_CANCELED then
  55. Log.d('---HandleActivityMessage-RESULT_CANCELED');
  56. if LCode = TJActivity.JavaClass.RESULT_FIRST_USER then
  57. Log.d('---HandleActivityMessage-RESULT_FIRST_USER');
  58. {$ENDIF}
  59. if LCode = TJActivity.JavaClass.RESULT_OK then begin
  60. if TMessageResultNotification(M).Value <> nil then begin
  61. URI := TMessageResultNotification(M).Value.getData;
  62. if URI <> nil then
  63. FileName := TAndroidHelperEx.FileFromUri(URI)
  64. {$IFDEF DEBUG}
  65. else
  66. Log.d('---HandleActivityMessage-URI:nil');
  67. {$ENDIF}
  68. end
  69. else begin
  70. {$IFDEF DEBUG}
  71. Log.d('---HandleActivityMessage-Value:nil');
  72. {$ENDIF}
  73. end;
  74. end;
  75. {$IFDEF DEBUG}
  76. Log.d('---HandleActivityMessage-ResultCode:%d-', [LCode]);
  77. {$ENDIF}
  78. if Assigned(FOpenFileCallback) then
  79. FOpenFileCallback(LCode, FileName);
  80. if Assigned(FOpenFileEvent) then
  81. FOpenFileEvent(LCode, FileName);
  82. if FMessageChooserID <> 0 then begin
  83. TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageChooserID);
  84. FMessageChooserID := 0;
  85. FOpenFileCallback := nil;
  86. FOpenFileEvent := nil;
  87. end;
  88. end;
  89. function OpenFileDialog(AExt, ADir: string; AData: Jnet_Uri = nil; AOpenFileCallback: TOpenFileCallback = nil; AOpenFileEvent: TOpenFileEvent = nil): Boolean;
  90. var
  91. LIntent: JIntent;
  92. LType: string;
  93. begin
  94. Result := False;
  95. LType := '';
  96. if (LType = '') or (AExt = '*.*') or (AExt = '*') then
  97. LType := ''
  98. else if Pos('/', AExt) > 0 then
  99. LType := AExt
  100. else
  101. LType := JStringToString(TAndroidHelperEx.GetMimeType(AExt));
  102. if LType = '' then
  103. LType := '*/*';
  104. LIntent := TJIntent.JavaClass.init(FAction);
  105. LIntent.setType(StringToJString(LType));
  106. //Intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 多选
  107. if FAction.equals(TJIntent.JavaClass.ACTION_PICK) then
  108. //Intent.setData(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI) // 这个可以用来限定APP,比如这个就是 图库
  109. //Intent.setData(TJContactsContract_Contacts.JavaClass.CONTENT_URI) // 联系人,不指定这个的话会直接取消
  110. else begin
  111. LIntent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
  112. if ADir <> '' then
  113. LIntent.setData(TAndroidHelperEx.UriParse(ADir));
  114. end;
  115. if FMessageChooserID = 0 then begin
  116. FMessageChooserID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage);
  117. FOpenFileCallback := AOpenFileCallback;
  118. FOpenFileEvent := AOpenFileEvent;
  119. end;
  120. try
  121. //Result := TAndroidHelperEx.StartActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence(ATitle)), FILE_SELECT_CODE)
  122. Result := TAndroidHelperEx.StartActivity(LIntent, FILE_SELECT_CODE);
  123. except
  124. raise Exception.Create('File Manager not found');
  125. end;
  126. end;
  127. procedure TForm1.btn1Click(Sender: TObject);
  128. begin
  129. FAction := TJIntent.JavaClass.ACTION_PICK;
  130. OpenFileDialog('*/*', '', nil,
  131. procedure(const ACode: Integer; const APath: string) begin
  132. if APath <> '' then
  133. mmo1.Lines.Add(APath)
  134. else
  135. mmo1.Lines.Add(Format('Error code: %d', [ACode]));
  136. end
  137. )
  138. end;
  139. procedure TForm1.btn2Click(Sender: TObject);
  140. begin
  141. FAction := TJIntent.JavaClass.ACTION_GET_CONTENT;
  142. OpenFileDialog('*/*', '', nil,
  143. procedure(const ACode: Integer; const APath: string) begin
  144. if APath <> '' then
  145. mmo1.Lines.Add(APath)
  146. else
  147. mmo1.Lines.Add(Format('Error code: %d', [ACode]));
  148. end
  149. )
  150. end;
  151. procedure TForm1.Button1Click(Sender: TObject);
  152. begin
  153. FAction := TJIntent.JavaClass.ACTION_OPEN_DOCUMENT;
  154. OpenFileDialog('*/*', '', nil,
  155. procedure(const ACode: Integer; const APath: string) begin
  156. if APath <> '' then
  157. mmo1.Lines.Add(APath)
  158. else
  159. mmo1.Lines.Add(Format('Error code: %d', [ACode]));
  160. end
  161. )
  162. end;
  163. end.