![]() |
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: ![]() Den Code habe ich eigentlich 1 zu 1 wie im Tutorial(nur ein paar Controls umbenannt):
Delphi-Quellcode:
Wenn ich den Kamera Button drücke, komme ich zur Kameraapp Auswahl, dort kann ich dann ein Bild machen(auch wenn komischerweise noch ein
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. 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. |
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. ![]() Damit klappt es bei mir ohne Probleme. |
AW: Android Foto aufnehmen DoDidFinish wird nicht getriggered
Zitat:
Delphi-Quellcode:
Die Permissions habe ich selbst hinzugefügt, da die ja sonst fehlen.
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. Es kommt auch die Meldung "Permissions granted" und beim Drücken auf den Camera Button kommt die oben genannte Fehlermeldung |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz