|
@@ -62,10 +62,10 @@ type
|
|
|
const
|
|
|
FILE_SELECT_CODE = 0;
|
|
|
var
|
|
|
- FMessageChooserID: Integer = 0;
|
|
|
- FOpenFileCallback: TOpenFileCallback;
|
|
|
- FOpenFileEvent: TOpenFileEvent;
|
|
|
- FAction: JString;
|
|
|
+ FOpenFileMessageID: Integer = 0;
|
|
|
+ FOpenFileCallback: TOpenFileCallback = nil;
|
|
|
+ FOpenFileEvent: TOpenFileEvent = nil;
|
|
|
+ FOpenFileAction: JString = nil;
|
|
|
|
|
|
// https://stackoverflow.com/questions/31002388/android-intent-extra-allow-multiple-allows-only-single-picking
|
|
|
procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
|
|
@@ -138,15 +138,16 @@ begin
|
|
|
if Assigned(LList) then
|
|
|
FreeAndNil(LList);
|
|
|
|
|
|
- if FMessageChooserID <> 0 then begin
|
|
|
- TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageChooserID);
|
|
|
- FMessageChooserID := 0;
|
|
|
+ if FOpenFileMessageID <> 0 then begin
|
|
|
+ TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FOpenFileMessageID);
|
|
|
+ FOpenFileMessageID := 0;
|
|
|
FOpenFileCallback := nil;
|
|
|
FOpenFileEvent := nil;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-function OpenFileDialog(AExt, ADir: string; AData: Jnet_Uri = nil; AAllowMultiSelect: Boolean = False; AOpenFileCallback: TOpenFileCallback = nil; AOpenFileEvent: TOpenFileEvent = nil): Boolean;
|
|
|
+function OpenFileDialog(AOpenFileCallback: TOpenFileCallback; AOpenFileEvent: TOpenFileEvent;
|
|
|
+ AExt, ADir: string; AData: Jnet_Uri; AAllowMultiSelect: Boolean): Boolean;
|
|
|
var
|
|
|
LIntent: JIntent;
|
|
|
LType: string;
|
|
@@ -164,13 +165,16 @@ begin
|
|
|
if LType = '' then
|
|
|
LType := '*/*';
|
|
|
|
|
|
- LIntent := TJIntent.JavaClass.init(FAction);
|
|
|
+ if FOpenFileAction = nil then //默认值
|
|
|
+ FOpenFileAction := TJIntent.JavaClass.ACTION_GET_CONTENT;
|
|
|
+
|
|
|
+ LIntent := TJIntent.JavaClass.init(FOpenFileAction);
|
|
|
LIntent.setType(StringToJString(LType));
|
|
|
|
|
|
if AAllowMultiSelect then
|
|
|
LIntent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE, true);
|
|
|
|
|
|
- if not FAction.equals(TJIntent.JavaClass.ACTION_PICK) then
|
|
|
+ if not FOpenFileAction.equals(TJIntent.JavaClass.ACTION_PICK) then
|
|
|
LIntent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
|
|
|
|
|
|
if AData <> nil then
|
|
@@ -178,8 +182,8 @@ begin
|
|
|
else if ADir <> '' then
|
|
|
LIntent.setData(TAndroidHelperEx.UriParse(ADir));
|
|
|
|
|
|
- if FMessageChooserID = 0 then begin
|
|
|
- FMessageChooserID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage);
|
|
|
+ if FOpenFileMessageID = 0 then begin
|
|
|
+ FOpenFileMessageID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage);
|
|
|
FOpenFileCallback := AOpenFileCallback;
|
|
|
FOpenFileEvent := AOpenFileEvent;
|
|
|
end;
|
|
@@ -200,46 +204,46 @@ procedure TForm1.btn1Click(Sender: TObject);
|
|
|
begin
|
|
|
//Intent.setData(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI) // 这个可以用来限定APP,比如这个就是 图库
|
|
|
//Intent.setData(TJContactsContract_Contacts.JavaClass.CONTENT_URI) // 联系人,不指定这个的话会直接取消
|
|
|
- FAction := TJIntent.JavaClass.ACTION_PICK;
|
|
|
- OpenFileDialog('*/*', '', TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, chkAllowMultiSelect.IsChecked,
|
|
|
- procedure(const ACode: Integer; const APath: string; const APathes: TStrings) begin
|
|
|
+ FOpenFileAction := TJIntent.JavaClass.ACTION_PICK;
|
|
|
+ OpenFileDialog(procedure(const ACode: Integer; const APath: string; const APathes: TStrings) begin
|
|
|
if APath <> '' then
|
|
|
mmo1.Lines.Add(APath)
|
|
|
else if Assigned(APathes) then
|
|
|
mmo1.Lines.AddStrings(APathes)
|
|
|
else
|
|
|
mmo1.Lines.Add(Format('Error code: %d', [ACode]));
|
|
|
- end
|
|
|
+ end,
|
|
|
+ nil, '*/*', '', TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, chkAllowMultiSelect.IsChecked
|
|
|
)
|
|
|
end;
|
|
|
|
|
|
procedure TForm1.btn2Click(Sender: TObject);
|
|
|
begin
|
|
|
- FAction := TJIntent.JavaClass.ACTION_GET_CONTENT;
|
|
|
- OpenFileDialog('*/*', '', nil, chkAllowMultiSelect.IsChecked,
|
|
|
- procedure(const ACode: Integer; const APath: string; const APathes: TStrings) begin
|
|
|
+ FOpenFileAction := TJIntent.JavaClass.ACTION_GET_CONTENT;
|
|
|
+ OpenFileDialog(procedure(const ACode: Integer; const APath: string; const APathes: TStrings) begin
|
|
|
if APath <> '' then
|
|
|
mmo1.Lines.Add(APath)
|
|
|
else if Assigned(APathes) then
|
|
|
mmo1.Lines.AddStrings(APathes)
|
|
|
else
|
|
|
mmo1.Lines.Add(Format('Error code: %d', [ACode]));
|
|
|
- end
|
|
|
+ end,
|
|
|
+ nil, '*/*', '', nil, chkAllowMultiSelect.IsChecked
|
|
|
)
|
|
|
end;
|
|
|
|
|
|
procedure TForm1.btn3Click(Sender: TObject);
|
|
|
begin
|
|
|
- FAction := TJIntent.JavaClass.ACTION_OPEN_DOCUMENT;
|
|
|
- OpenFileDialog('*/*', '', nil, chkAllowMultiSelect.IsChecked,
|
|
|
- procedure(const ACode: Integer; const APath: string; const APathes: TStrings) begin
|
|
|
+ FOpenFileAction := TJIntent.JavaClass.ACTION_OPEN_DOCUMENT;
|
|
|
+ OpenFileDialog(procedure(const ACode: Integer; const APath: string; const APathes: TStrings) begin
|
|
|
if APath <> '' then
|
|
|
mmo1.Lines.Add(APath)
|
|
|
else if Assigned(APathes) then
|
|
|
mmo1.Lines.AddStrings(APathes)
|
|
|
else
|
|
|
mmo1.Lines.Add(Format('Error code: %d', [ACode]));
|
|
|
- end
|
|
|
+ end,
|
|
|
+ nil, '*/*', '', nil, chkAllowMultiSelect.IsChecked
|
|
|
)
|
|
|
end;
|
|
|
|