Hi, einfach nur ein kleiner Post weil ich dazu online nichts gefunden hatte und es mich das ein oder andere graue Haar gekostet hat bis ich es raus hatte. Vielleicht hilft es ja jemand.
Das Problem
Wenn Sie die TakePhotoAction aus der ActionList verwenden, wird Ihre App in den Hintergrund verschoben, und die Kamera-App des Systems wird in den Vordergrund gebracht. Viele Hersteller nutzen diesen Moment, um den Speicher aufzuräumen, was dazu führen kann, dass Ihre App vom System angehalten wird.
Nach Abschluss der Fotoaufnahme wird die TPhotoActivityResponseListener.onResponse von FMX.MediaLibrary.Android ausgelöst. Allerdings ist die ursprüngliche Methode LParams.OnDidFinishTaking nicht mehr zugewiesen, da die App während des Prozesses angehalten wurde.
Die Schwelle für dieses Verhalten hängt von den Speicherverwaltungseinstellungen des Herstellers ab. Basierend auf meinen Erkenntnissen:
- Samsung-Geräte sind tendenziell am aggressivsten und halten Apps oft an, wenn die Speichernutzung ~50 MB überschreitet.
- Andere Hersteller beginnen möglicherweise damit, Apps bei etwa ~100 MB anzuhalten.
- Wenn speicheroptimierende Einstellungen vom Hersteller aktiviert sind, scheint ~500 MB eine "harte Grenze" zu sein, bei der Ihre App fast jedes Mal angehalten wird.
Um dies zu umgehen, sollten Sie eine Logik implementieren, die das Anhalten und Wiederherstellen der App korrekt behandelt, oder alternative Wege suchen, um den Fotoaufnahmeprozess zu verwalten.
Die Lösung
Stellen Sie zunächst sicher, dass der Code, der im OnTakePhotoFinish-Event ausgeführt wird, nur das Bild verarbeitet, das an das Event übergeben wird, und dass alle an diesem Prozess beteiligten Komponenten nach dem Neustart der App ordnungsgemäß verfügbar sind. Falls erforderlich, speichern Sie den aktuellen Zustand Ihrer Anwendung mithilfe des SaveState-Events. Dies ermöglicht es Ihnen, die benötigten App-Informationen wiederherzustellen und die richtigen Punkte nach dem Neustart der App zu navigieren. Weitere Details finden Sie in der FireMonkey Save State-Dokumentation:
https://docwiki.embarcadero.com/RADS...key_Save_State
In dem ersten Formular, das nach dem Neustart Ihrer App erstellt wird, sollten Sie den MessageManager im OnCreate-Event einbinden. Hier ist ein Beispiel:
Code:
type
TStartForm = class(TForm)
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
procedure MessageHandlerTakePhoto(const Sender: TObject; const M: TMessage);
end;
procedure TStartForm.FormCreate(Sender: TObject);
begin
TMessageManager.DefaultManager.SubscribeToMessage(TMessageDidFinishTakingImageFromCamera, MessageHandlerTakePhoto);
end;
procedure TStartForm.FormDestroy(Sender: TObject);
begin
TMessageManager.DefaultManager.Unsubscribe(TMessageDidFinishTakingImageFromCamera, MessageHandlerTakePhoto);
end;
procedure TStartForm.MessageHandlerTakePhoto(const Sender: TObject; const M: TMessage);
begin
if M is TMessageDidFinishTakingImageFromCamera then
begin
if Assigned(TMessageDidFinishTakingImageFromCamera(M).Value) then
begin
// Do something with the TMessageDidFinishTakingImageFromCamera(M).Value (TBitmap)
end;
end;
end;
vG
PJM