Einzelnen Beitrag anzeigen

lereis

Registriert seit: 6. Jul 2019
7 Beiträge
 
Delphi 10.3 Rio
 
#1

Android Foto aufnehmen DoDidFinish wird nicht getriggered

  Alt 7. Jan 2020, 19:41
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.

Geändert von lereis ( 7. Jan 2020 um 19:57 Uhr)
  Mit Zitat antworten Zitat