Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Android Foto aufnehmen DoDidFinish wird nicht getriggered (https://www.delphipraxis.net/203045-android-foto-aufnehmen-dodidfinish-wird-nicht-getriggered.html)

lereis 7. Jan 2020 19:41

Android Foto aufnehmen DoDidFinish wird nicht getriggered
 
Guten Abend,

Ich versuche mich im Moment mit Hilfe von Delphi 10.3 und Firemonkey ein Bild mit einer Android Kamer aufzunehmen und anzuzeigen.
dafür habe ich folgendes Tutorial befolge: http://docwiki.embarcadero.com/RADSt...key_Interfaces

Den Code habe ich eigentlich 1 zu 1 wie im Tutorial(nur ein paar Controls umbenannt):
Delphi-Quellcode:
unit Camera;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.MediaLibrary, FMX.Platform, System.Messaging,
  FMX.Objects, FMX.StdCtrls, FMX.Controls.Presentation, System.Permissions,FMX.DialogService,
  {$IFDEF ANDROID}
  Androidapi.Jni.Os,
  Androidapi.Helpers
  {$ENDIF};

type
  TfrmMain = class(TForm)
    tbMain: TToolBar;
    btnCaptureImage: TSpeedButton;
    btnSelectImage: TSpeedButton;
    imgMain: TImage;
    procedure btnCaptureImageClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnSelectImageClick(Sender: TObject);
  private
    { Private-Deklarationen }

    FPermissionCamera: string;
    FPermissionReadStorage: string;
    FPermissionWriteStorage: string;

     procedure DoDidFinish(Image: TBitmap);
     procedure DoMessageListener(const Sender: TObject; const M: TMessage);
  public
    { Public-Deklarationen }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.fmx}

 procedure TfrmMain.DoDidFinish(Image: TBitmap);
begin
  showmessage('bild wird gemalt');
  imgMain.Bitmap.Assign(Image);
end;

procedure TfrmMain.DoMessageListener(const Sender: TObject; const M: TMessage);
begin
  if M is TMessageDidFinishTakingImageFromLibrary then
  begin
    imgMain.Bitmap.Assign(TMessageDidFinishTakingImageFromLibrary(M).Value);
  end;

end;


procedure TfrmMain.FormShow(Sender: TObject);
begin
  FPermissionCamera := JStringToString(TJManifest_permission.JavaClass.CAMERA);
  FPermissionReadStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
  FPermissionWriteStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);

  PermissionsService.RequestPermissions([FPermissionCamera,FPermissionReadStorage,FPermissionWriteStorage],
   procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
   begin
        if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted)then
          TDialogService.ShowMessage('permissions granted')
        else
        begin
          TDialogService.ShowMessage('permissions not granted');
        end;
      end
  );

end;

procedure TfrmMain.btnCaptureImageClick(Sender: TObject);
var
  Service: IFMXCameraService;
  Params: TParamsPhotoQuery;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXCameraService,
    Service) then
  begin
    Params.Editable := True;
    Params.NeedSaveToAlbum := True;
    Params.RequiredResolution := TSize.Create(640, 640);
    Params.OnDidFinishTaking := DoDidFinish;
    Service.TakePhoto(btnCaptureImage, Params);
  end
  else
    ShowMessage('This device does not support the camera service');
end;

procedure TfrmMain.btnSelectImageClick(Sender: TObject);
var
  ImageService: IFMXTakenImageService;
  Params: TParamsPhotoQuery;
begin

  if TPlatformServices.Current.SupportsPlatformService(IFMXTakenImageService,
    IInterface(ImageService)) then
  begin
    Params.RequiredResolution := TSize.Create(640, 640);
    Params.OnDidFinishTaking := DoDidFinish;
    ImageService.TakeImageFromLibrary(btnSelectImage, Params);
  end;
end;

end.
Wenn ich den Kamera Button drücke, komme ich zur Kameraapp Auswahl, dort kann ich dann ein Bild machen(auch wenn komischerweise noch ein
zusätzlicher, leicht versetzter Button zum Auslösen vorhanden war). Dannach drücke ich auf OK und komme zur Abfrage mit welcher App ich den Vorgang abschließen will.
Egal ob ich eine auswähle oder nicht, das aufgenommene Bild wird nicht angezeigt und ist auch nicht in den gespeicherten Bilder, obwohl Params.NeedSaveToAlbum := True;
in Zeile 89 gesetzt ist. Die DoDidFinish Methode in Zeile 43 wird nicht ausgelöst. Die btnCaptureImageClick in Zeile 79, in der das DoDidFinish Event
im Parameter gesetzt wird, läuft aber komplett durch.
Also irgendwie bekommt er meine Parameterliste nicht mit.
Bild aus der Galerie auswählen und anzeigen klappt übrigens perfekt.

Ich hoffe jemand hat eine Idee und bedanke mich schoneinmal fürs mitlesen.

tggmx 7. Jan 2020 21:01

AW: Android Foto aufnehmen DoDidFinish wird nicht getriggered
 
Hast du schon geprüft ob das Setzen der Berechtigungen funktioniert hat?

Alternativ kannst du es über eine ActionList versuchen.

http://docwiki.embarcadero.com/RADSt...g_Action_Lists

Damit klappt es bei mir ohne Probleme.

lereis 7. Jan 2020 21:55

AW: Android Foto aufnehmen DoDidFinish wird nicht getriggered
 
Zitat:

Zitat von tggmx (Beitrag 1454568)
Hast du schon geprüft ob das Setzen der Berechtigungen funktioniert hat?

Alternativ kannst du es über eine ActionList versuchen.

http://docwiki.embarcadero.com/RADSt...g_Action_Lists

Damit klappt es bei mir ohne Probleme.

Da bekomme ich den Fehler: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(an droid.content.pm.PacketManager,java.lang.String)' on a null space reference
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Actions,
  FMX.ActnList, FMX.StdActns, FMX.MediaLibrary.Actions, FMX.Objects,
  FMX.StdCtrls, FMX.Controls.Presentation, System.Permissions, FMX.DialogService,
  {$IFDEF ANDROID}
    Androidapi.Jni.Os,
    Androidapi.Helpers
  {$ENDIF};
type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    btnCaptureImage: TButton;
    btnSearchImage: TButton;
    btnShare: TButton;
    Image1: TImage;
    ActionList1: TActionList;
    TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
    procedure TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    FPermissionCamera: string;
    FPermissionReadStorage: string;
    FPermissionWriteStorage: string;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormShow(Sender: TObject);
begin
  FPermissionCamera := JStringToString(TJManifest_permission.JavaClass.CAMERA);
  FPermissionReadStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
  FPermissionWriteStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);

  PermissionsService.RequestPermissions([FPermissionCamera,FPermissionReadStorage,FPermissionWriteStorage],
   procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
   begin
        if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted)then
          TDialogService.ShowMessage('permissions granted')
        else
        begin
          TDialogService.ShowMessage('permissions not granted');
        end;
      end
  );
end;

procedure TForm1.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
  Image1.Bitmap.Assign(Image);
end;

end.
Die Permissions habe ich selbst hinzugefügt, da die ja sonst fehlen.
Es kommt auch die Meldung "Permissions granted" und beim Drücken auf den Camera Button kommt die oben genannte Fehlermeldung


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf