2017-02-14 3 views
1

Hier ist der Code, den ich verwende.Mit IFMXCameraService.TakePhoto gibt es eine Möglichkeit, den Image-Pfad zu erhalten?

procedure TForm1.getpic; 
var 
    Service: IFMXCameraService; 
    Params: TParamsPhotoQuery; 
begin 
    if TPlatformServices.Current.SupportsPlatformService(IFMXCameraService, 
    Service) then 
    begin 
    Params.Editable := false; 
    Params.NeedSaveToAlbum := True; 
    Params.RequiredResolution := TSize.Create(640,640); 
    Params.OnDidFinishTaking := DoDidFinishTakePic; 
    Service.TakePhoto(nil, Params); 
    end 
    else 
    xShowMessage('This device does not support the camera service'); 
end; 

procedure TForm1.DoDidFinishTakePic(Image: TBitmap); 
var 
    Imagepath:string; 
begin 
    Image1.Bitmap.Assign(Image); 
    Imagepath := fmx.platform.TMessageReceivedImagePath; 
end; 

Offenbar aus:

http://docwiki.embarcadero.com/RADStudio/en/List_of_FireMonkey_Message_Types

gibt es TMessageReceivedImagePath in fmx.platform gefunden. Aber ich kann es nirgendwo finden. Ich benutze 10.1 Berlin Update 2. Ich postete dies im Embarcadero Forum (danke Remy für die Antwort), aber ich hoffe, dass jemand hier eine Antwort hat.

PS/ich möchte auch die DateTime des aufgenommenen Bildes speichern.

In der Zwischenzeit habe ich einen Workaround, aber es ist hässlich und ich bin mir sicher, wird nicht immer funktionieren wegen der zweiten Genauigkeit Timing des Take Photo.

procedure TForm1.DoDidFinishTakePic(Image: TBitmap); 
var 
    Imagepath:string; 
begin 
    Image1.Bitmap.Assign(Image); 
    st := datetimetostr(System.SysUtils.Now,xfs); 
    Imagepath := 'IMG_'+copy(st,1,4)+copy(st,6,2)+copy(st,9,2)+'_'+copy(st,12,2)+copy(st,15,2)+copy(st,18,2)+'.jpg'; 
end; 
+0

Was ist los mit der Antwort, die ich Ihnen schon früher gab? Abonnieren der "TMessageReceivedImagePath" Nachricht ist die Lösung, also was ist das eigentliche Problem, das Sie damit haben? –

+0

Das Problem ist, dass TMessageReceivedImagePath in keiner Einheit gefunden werden kann. Ja, der gesamte Code und die von Ihnen bereitgestellten Lösungen funktionieren, vorausgesetzt, dass TMessageReceivedImagePath gefunden werden kann. – sandman

+1

Sie können 'FormatDateTime()' verwenden, anstatt das Ergebnis von 'DateTimeToStr()' zu zerhacken: 'ImagePath: = FormatDateTime ('" IMG_ "yyyymmdd" _ "hhnnss" .jpg "' Now);' –

Antwort

1

Als ich auf dem Embarcadero forum gesagt, alles, was Sie tun müssen, ist auf die TMessageReceivedImagePath Nachricht abonnieren, zB:

TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedImagePath, DoMessageListener); 

... 

procedure TForm1.DoMessageListener(const Sender: TObject; const M: TMessage); 
var 
    ImagePath: string; 
begin 
    if M is TMessageReceivedImagePath then 
    begin 
    ImagePath := TMessageReceivedImagePath(M).Value; 
    ... 
    end; 
end; 

Embarcadero dokumentiert die Nachricht in der FMX.Platform Einheit ist. Wenn Sie es dort nicht finden können, überprüfen Sie, ob es in der FMX.Platform.Android Einheit (da es eine Android-spezifische Nachricht ist) oder der FMX.MediaLibrary Einheit (die die anderen Foto/Video-Capture-Nachrichten definiert) ist.

+0

Wie bereits erwähnt Im Forum kann ich TMessageReceivedImagePath in keiner Einheit finden. Auch die Verwendung der "Find-Deklaration" findet nichts. – sandman

+0

OK, Sie haben sowohl fmx.platform als auch fmx.platform.android in der uses-Klausel deklariert und finden sie dann. Was für eine Mission :(Ich dachte, wenn Sie das Elternteil erklären, dass es alle Kinderkomponenten unten finden sollte? – sandman

+0

... und "Finden Sie Erklärung" funktioniert nicht sehr gut! – sandman

Verwandte Themen