Ver Fonte

rename StartActivity to CheckAndStartActivity
tweak demo

KngStr há 5 anos atrás
pai
commit
89065c41f2
3 ficheiros alterados com 122 adições e 41 exclusões
  1. 28 14
      Demos/Android Helper/Unit1.fmx
  2. 64 17
      Demos/Android Helper/Unit1.pas
  3. 30 10
      Source/ksAndroid.Helpers.pas

+ 28 - 14
Demos/Android Helper/Unit1.fmx

@@ -7,6 +7,8 @@ object Form1: TForm1
   FormFactor.Width = 320
   FormFactor.Height = 480
   FormFactor.Devices = [Desktop]
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
   DesignerMasterStyle = 0
   object mmo1: TMemo
     Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
@@ -21,46 +23,58 @@ object Form1: TForm1
       'ACTION_OPEN_DOCUMENT'
       '  '#26032#24335#36873#21462#26041#24335#65292#20294#37096#20998'URI'#26080#27861#36716#25104#25991#20214#36335#24452
       '  '#22914#65306#31995#32479#19979#36733#30446#24405#65292#23433#21331'10'#24320#22987#30340#25152#26377#25991#26723#31867#22411#30446#24405)
+    TextSettings.WordWrap = True
     Anchors = [akLeft, akTop, akRight, akBottom]
-    Position.Y = 137.000000000000000000
+    Position.Y = 172.000000000000000000
     Size.Width = 383.000000000000000000
-    Size.Height = 343.000000000000000000
+    Size.Height = 308.000000000000000000
     Size.PlatformDefault = False
     TabOrder = 0
     Viewport.Width = 379.000000000000000000
-    Viewport.Height = 323.000000000000000000
+    Viewport.Height = 304.000000000000000000
   end
   object btn1: TButton
     Anchors = [akLeft, akTop, akRight]
-    Position.X = 9.000000000000000000
-    Position.Y = 10.000000000000000000
+    Position.X = 10.000000000000000000
+    Position.Y = 46.000000000000000000
     Size.Width = 361.000000000000000000
     Size.Height = 28.000000000000000000
     Size.PlatformDefault = False
-    TabOrder = 1
+    TabOrder = 2
     Text = 'ACTION_PICK'
     OnClick = btn1Click
   end
   object btn2: TButton
     Anchors = [akLeft, akTop, akRight]
-    Position.X = 9.000000000000000000
-    Position.Y = 49.000000000000000000
+    Position.X = 10.000000000000000000
+    Position.Y = 87.000000000000000000
     Size.Width = 361.000000000000000000
     Size.Height = 28.000000000000000000
     Size.PlatformDefault = False
-    TabOrder = 3
+    TabOrder = 4
     Text = 'ACTION_GET_CONTENT'
     OnClick = btn2Click
   end
-  object Button1: TButton
+  object btn3: TButton
     Anchors = [akLeft, akTop, akRight]
-    Position.X = 9.000000000000000000
-    Position.Y = 88.000000000000000000
+    Position.X = 10.000000000000000000
+    Position.Y = 128.000000000000000000
     Size.Width = 361.000000000000000000
     Size.Height = 28.000000000000000000
     Size.PlatformDefault = False
-    TabOrder = 2
+    TabOrder = 3
     Text = 'ACTION_OPEN_DOCUMENT'
-    OnClick = Button1Click
+    OnClick = btn3Click
+  end
+  object btn4: TButton
+    Anchors = [akLeft, akTop, akRight]
+    Position.X = 10.000000000000000000
+    Position.Y = 6.000000000000000000
+    Size.Width = 361.000000000000000000
+    Size.Height = 28.000000000000000000
+    Size.PlatformDefault = False
+    TabOrder = 1
+    Text = 'FMXMediaLibrary.takeImageFromLibrary'
+    OnClick = btn4Click
   end
 end

+ 64 - 17
Demos/Android Helper/Unit1.pas

@@ -3,6 +3,7 @@ unit Unit1;
 interface
 
 uses
+  System.Messaging,
   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, FMX.ScrollBox, FMX.Memo;
@@ -12,12 +13,18 @@ type
     mmo1: TMemo;
     btn1: TButton;
     btn2: TButton;
-    Button1: TButton;
+    btn3: TButton;
+    btn4: TButton;
     procedure btn2Click(Sender: TObject);
     procedure btn1Click(Sender: TObject);
-    procedure Button1Click(Sender: TObject);
+    procedure btn3Click(Sender: TObject);
+    procedure btn4Click(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
   private
     { Private declarations }
+    procedure DoReceivedImagePath(const Sender: TObject; const M: TMessage);
+    procedure DoCancelReceivingImage(const Sender: TObject; const M: TMessage);
   public
     { Public declarations }
   end;
@@ -31,11 +38,12 @@ implementation
 
 uses
   {$IFDEF ANDROID}
-  Androidapi.JNI.GraphicsContentViewText,
+  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Provider,
   Androidapi.JNI.JavaTypes, Androidapi.JNI.App, Androidapi.JNI.Net,
   Androidapi.Helpers, ksAndroid.Helpers,
+  FMX.Platform.Android,
   {$ENDIF}
-  System.Messaging;
+  FMX.Platform;
 
 type
   TOpenFileCallback = reference to procedure(const ACode: Integer; const APath: string);
@@ -125,14 +133,14 @@ begin
   LIntent := TJIntent.JavaClass.init(FAction);
   LIntent.setType(StringToJString(LType));
   //Intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 多选
-  if FAction.equals(TJIntent.JavaClass.ACTION_PICK) then
-    //Intent.setData(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI) // 这个可以用来限定APP,比如这个就是 图库
-    //Intent.setData(TJContactsContract_Contacts.JavaClass.CONTENT_URI) // 联系人,不指定这个的话会直接取消
-  else begin
+
+  if not FAction.equals(TJIntent.JavaClass.ACTION_PICK) then
     LIntent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
-    if ADir <> '' then
-      LIntent.setData(TAndroidHelperEx.UriParse(ADir));
-  end;
+
+  if AData <> nil then
+    LIntent.setData(AData)
+  else if ADir <> '' then
+    LIntent.setData(TAndroidHelperEx.UriParse(ADir));
 
   if FMessageChooserID = 0 then begin
     FMessageChooserID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage);
@@ -141,17 +149,23 @@ begin
   end;
 
   try
-    //Result := TAndroidHelperEx.StartActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence(ATitle)), FILE_SELECT_CODE)
-    Result := TAndroidHelperEx.StartActivity(LIntent, FILE_SELECT_CODE);
-  except
-    raise Exception.Create('File Manager not found');
+    try
+      //Result := TAndroidHelperEx.StartActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence(ATitle)), FILE_SELECT_CODE)
+      Result := TAndroidHelperEx.StartActivity(LIntent, FILE_SELECT_CODE);
+    except
+      raise Exception.Create('File Manager not found');
+    end;
+  finally
+    Form1.mmo1.Lines.Add(Format('OpenFileDialog:%s', [BoolToStr(Result, True)]));
   end;
 end;
 
 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('*/*', '', nil,
+  OpenFileDialog('*/*', '', TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI,
     procedure(const ACode: Integer; const APath: string) begin
       if APath <> '' then
         mmo1.Lines.Add(APath)
@@ -174,7 +188,7 @@ begin
   )
 end;
 
-procedure TForm1.Button1Click(Sender: TObject);
+procedure TForm1.btn3Click(Sender: TObject);
 begin
   FAction := TJIntent.JavaClass.ACTION_OPEN_DOCUMENT;
   OpenFileDialog('*/*', '', nil,
@@ -187,4 +201,37 @@ begin
   )
 end;
 
+procedure TForm1.btn4Click(Sender: TObject);
+var
+  FSize: TSize;
+begin
+  FSize.cx := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize);
+  FSize.cy := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize);
+  MainActivity.getFMXMediaLibrary.takeImageFromLibrary(FSize.Width, FSize.Height, False);
+end;
+
+procedure TForm1.DoCancelReceivingImage(const Sender: TObject; const M: TMessage);
+begin
+  if (M is TMessageCancelReceivingImage) then
+    mmo1.Lines.Add('TMessageCancelReceivingImage');
+end;
+
+procedure TForm1.DoReceivedImagePath(const Sender: TObject; const M: TMessage);
+begin
+  if (M is TMessageReceivedImagePath) then
+    mmo1.Lines.Add(Format('TMessageReceivedImagePath: %s', [(M as TMessageReceivedImagePath).Value]));
+end;
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+  TMessageManager.DefaultManager.SubscribeToMessage(TMessageCancelReceivingImage, DoCancelReceivingImage);
+  TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedImagePath, DoReceivedImagePath);
+end;
+
+procedure TForm1.FormDestroy(Sender: TObject);
+begin
+  TMessageManager.DefaultManager.Unsubscribe(TMessageReceivedImagePath, DoReceivedImagePath);
+  TMessageManager.DefaultManager.Unsubscribe(TMessageCancelReceivingImage, DoCancelReceivingImage);
+end;
+
 end.

+ 30 - 10
Source/ksAndroid.Helpers.pas

@@ -138,6 +138,8 @@ type
     class procedure SendAppToBack; static;
     /// <summary>Call a Java Activity</summary>
     class function StartActivity(Intent: JIntent; const Code: Integer = -1): Boolean; static;
+    /// <summary>Check HasAssocApp and Call a Java Activity</summary>
+    class function CheckAndStartActivity(Intent: JIntent; const Code: Integer = -1): Boolean; static;
 
     /// <summary>Returns Application package name</summary>
     class function GetPackageName: string; static;
@@ -178,6 +180,15 @@ begin
   ActivityManager.moveTaskToFront(Activity.getTaskId, TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
 end;
 
+class function TAndroidHelperEx.CheckAndStartActivity(Intent: JIntent;
+  const Code: Integer): Boolean;
+begin
+  Result := (Intent <> nil) and HasAssocApp(Intent);
+  if not Result then
+    Exit;
+  Result := TAndroidHelperEx.StartActivity(Intent, Code);
+end;
+
 class function TAndroidHelperEx.CheckBuildAndTarget(const AValue: Integer): Boolean;
 begin
   Result := (GetBuildSdkVersion >= AValue) and (GetTargetSdkVersion >= AValue);
@@ -487,11 +498,19 @@ class function TAndroidHelperEx.HasAssocApp(const Intent: JIntent): Boolean;
 var
   LList: JList;
 begin
+  Result := False;
+  if Intent = nil then
+    Exit;
+
+  Result := Intent.resolveActivityInfo(Activity.getPackageManager(),
+    TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY) <> nil;
+
   // Android 6+ APP LINK closed Will cause list is null.
   // Activity with <action android:name="android.intent.action.VIEW" />
-  LList := Activity.getPackageManager.queryIntentActivities(Intent,
-    TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY);
-  Result := (LList <> nil) and (LList.size > 0);
+  // 被第三方软件套用的时候,比如应用隐藏大师,会导致这里size不正确
+//  LList := Activity.getPackageManager.queryIntentActivities(Intent,
+//    TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY);
+//  Result := (LList = nil) or (LList.size > 0);
 end;
 
 class function TAndroidHelperEx.HasAssocApp(const URI: string): Boolean;
@@ -499,6 +518,9 @@ var
   Intent: JIntent;
 begin
   Result := False;
+  if URI = '' then
+    Exit;
+
   Intent := TJIntent.Create;
   Intent.setData(UriParse(URI));
   Intent.setAction(StringToJString('android.intent.action.VIEW'));
@@ -582,13 +604,11 @@ end;
 class function TAndroidHelperEx.StartActivity(Intent: JIntent; const Code: Integer): Boolean;
 begin
   Result := False;
-  if HasAssocApp(Intent) then begin
-    if Code = -1 then
-      Activity.startActivity(Intent)
-    else
-      Activity.startActivityForResult(Intent, Code);
-    Result := True;
-  end;
+  if Code = -1 then
+    Activity.startActivity(Intent)
+  else
+    Activity.startActivityForResult(Intent, Code);
+  Result := True;
 end;
 
 class function TAndroidHelperEx.UriParse(const S: JString): Jnet_Uri;