AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Android Foto aufnehmen DoDidFinish wird nicht getriggered

Android Foto aufnehmen DoDidFinish wird nicht getriggered

Ein Thema von lereis · begonnen am 7. Jan 2020 · letzter Beitrag vom 7. Jan 2020
Antwort Antwort
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
tggmx

Registriert seit: 29. Okt 2006
Ort: Würzburg
18 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Android Foto aufnehmen DoDidFinish wird nicht getriggered

  Alt 7. Jan 2020, 21:01
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.
Tobias
  Mit Zitat antworten Zitat
lereis

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

AW: Android Foto aufnehmen DoDidFinish wird nicht getriggered

  Alt 7. Jan 2020, 21:55
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

Geändert von lereis ( 7. Jan 2020 um 22:00 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf