Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android APP crashed / startet neu bei Bild / Foto über die Actionlist / Systemkamera (https://www.delphipraxis.net/216614-android-app-crashed-startet-neu-bei-bild-foto-ueber-die-actionlist-systemkamera.html)

fisipjm 28. Jan 2025 11:05

Android APP crashed / startet neu bei Bild / Foto über die Actionlist / Systemkamera
 
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:

Delphi-Quellcode:
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

QuickAndDirty 30. Jan 2025 07:45

AW: Android APP crashed / startet neu bei Bild / Foto über die Actionlist / Systemkam
 
1. Das macht eigentlich TTakePhotoAction unbrauchbar.
2. In Tests habe ich das noch nicht erlebt, aber der Aufwand ist doch erheblich, für ein simples Foto.
3. Ich kenne niemanden der Leute in internet foren siezt, da die Netiquette hier das Du vorsieht. Schreibe ich hier mit einem Bot/LLM ?

fisipjm 1. Mär 2025 17:59

AW: Android APP crashed / startet neu bei Bild / Foto über die Actionlist / Systemkam
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1545769)
1. Das macht eigentlich TTakePhotoAction unbrauchbar.

Nein, nur schwierig einzusetzen :-D
Im Beispiel Projekt von Embarcadero funktioniert der Aufruf immer, weil der Test nur auf einer einzigen Form aufbaut. Sobald die Form die nach dem Start geladen wird eine andere ist läuft der Messagehandler ins leere.
Zitat:

Zitat von QuickAndDirty (Beitrag 1545769)
2. In Tests habe ich das noch nicht erlebt, aber der Aufwand ist doch erheblich, für ein simples Foto.

Hast du mit dem Emba Beispiel getestet? Bzw. nur eine Form genutzt, dann funktioniert es aus dem Stand. Der Aufwand ist überschaubar, wenn der Code entsprechend strukturiert ist und keine Pfadabhängigkeiten in den Formaufrufen hat.


Zitat:

Zitat von QuickAndDirty (Beitrag 1545769)
3. Ich kenne niemanden der Leute in internet foren siezt, da die Netiquette hier das Du vorsieht. Schreibe ich hier mit einem Bot/LLM ?

Nein, kein LLM. Ich hab den ursprünglichen Post in englisch verfasst und ein LLM zum übersetzen verwendet, erwischt :-D und da hat die künstliche "Intelligenz" scheinbar nicht genug Kontext von mir bekommen :oops:

QuickAndDirty 3. Mär 2025 11:24

AW: Android APP crashed / startet neu bei Bild / Foto über die Actionlist / Systemkam
 
Zitat:

Zitat von fisipjm (Beitrag 1546693)
Zitat:

Zitat von QuickAndDirty (Beitrag 1545769)
3. Ich kenne niemanden der Leute in internet foren siezt, da die Netiquette hier das Du vorsieht. Schreibe ich hier mit einem Bot/LLM ?

Nein, kein LLM. Ich hab den ursprünglichen Post in englisch verfasst und ein LLM zum übersetzen verwendet, erwischt :-D und da hat die künstliche "Intelligenz" scheinbar nicht genug Kontext von mir bekommen :oops:

OMG. I'm glad you are not actually a person that insists on keeping the conversation formal on the Internet.
Also your LLM would make for bad spy.

Zitat:

Zitat von fisipjm (Beitrag 1546693)
Zitat:

Zitat von QuickAndDirty (Beitrag 1545769)
2. In Tests habe ich das noch nicht erlebt, aber der Aufwand ist doch erheblich, für ein simples Foto.

Hast du mit dem Emba Beispiel getestet? Bzw. nur eine Form genutzt, dann funktioniert es aus dem Stand. Der Aufwand ist überschaubar, wenn der Code entsprechend strukturiert ist und keine Pfadabhängigkeiten in den Formaufrufen hat.

I allways do have some Forms instaciated. And so far it worked. Yet I'm not testing with all Veriosns of Android.

1.The first form that is Instanciated is a Splash-screen...while database tables are cashed and NFC and similar subscriptions are initialized.
2.Then My Main-Formular hosting the the Viewports and the Menu is initialized and the Splash screen is closed.
3.Depending on the Navigation inside the APP a Form is instanciated to be shown through the Viewports. The Form is closed when App-navigation has to create and show a different form through the Viewports.

That is the setup.
And so far I could allways use the takephoto action. Is there something wrong or risky that would affect the Messageque in that scenario?

fisipjm 4. Mär 2025 13:35

AW: Android APP crashed / startet neu bei Bild / Foto über die Actionlist / Systemkam
 
Zunächst mal können wir gern im deutschen bleiben :-D
Der original Post war nur englisch, weil ich die Erfahrung gemacht hab, dass die ohnehin schon sehr seltene Spezies des Mobile-Developers im Delphi Umfeld wenn überhaupt englisch spricht :lol:

Zitat:

Zitat von QuickAndDirty (Beitrag 1546740)
And so far I could allways use the takephoto action. Is there something wrong or risky that would affect the Messageque in that scenario?

Ich würde sagen das kommt drauf an. Was für ein Gerät nutzt du für deine Entwicklung? Je näher du an Plain Android dran bist um so weniger wird das auffallen. Je mehr "Optimierungen" die Hersteller vornehmen um so eher wird das zum Problem.
Wie hoch ist deine RAM Auslastung? Ich verwende um das einfach und schnell auf Android festzustellen das wirklich grandiose Framework Kastri.
Einfach die Unit
Code:
DW.Androidapi.JNI.Os
einbinden.
Code:
TJDebug.JavaClass.getNativeHeapSize
gibt dir dann den verwendeten RAM deiner APP in Byte aus (Also einfach nochmal div (1024*1024) rechnen um auf die MB zu kommen)
Wenn du dauerhaft unter den 100 MB liegst, bekommst du wahrscheinlich niemals etwas davon mit. Und die 1-2 mal von 100 wird sich wahrscheinlich kein Anwender beschweren sondern einfach nochmal von Vorne anfangen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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-2025 by Thomas Breitkreuz