Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android Intent "Action_Call" (https://www.delphipraxis.net/208914-android-intent-action_call.html)

Phantom1 28. Sep 2021 13:33

Android Intent "Action_Call"
 
Moin zusammen,

hab da mal eine Anfängerfrage zur Android APP Entwicklung.

Die APP soll automatisch einen Anruf tätigen. Das klappt soweit mit dem Code hier:

Code:
procedure TTestForm.CallAPhone(const ANumber: string);
var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_CALL);
  Intent.setData(StrToJURI('tel:' + ANumber));
  TAndroidHelper.Activity.startActivity(Intent);
end;
Aber sobald die APP im "Hintergrund" läuft funktioniert dieser Code unter den neueren Android Versionen nicht mehr. Wie kann man das Problem lösen? mit einem ForegroundService oder so? Hab schon vieles ausprobiert, aber es klappt leider nicht.

Vielen dank schonmal!

Rollo62 28. Sep 2021 17:19

AW: Android Intent "Action_Call"
 
Zitat:

Zitat von Phantom1 (Beitrag 1495504)
Die APP soll automatisch einen Anruf tätigen. Das klappt soweit mit dem Code hier:

Im Hintergrund anrufen ist so ziemlich am Verbotensten (wenn man das so weit steigern kann) was man unter Mobile machen kann :stupid:
Ich fürchte dafür gibt es gar keine Lösung, ausser irgendwelchen Hacks.
Was genau soll das denn bringen, das Phone ist gerade in der Tasche, und die App ruft irgendwo an ?

Vielleicht funktioniert das bei Dir ?
https://stackoverflow.com/questions/...d-call-android

Phantom1 29. Sep 2021 07:38

AW: Android Intent "Action_Call"
 
Danke für deine Antwort. Der Sinn dahinter ist eine art Notfall APP die in bestimmten Situationen automatisch einen Anruf an eine vorher angegebene Person tätigt.

Auf Android 8 funktioniert der Code übrigens auch im Hintergrund, aber bei Android 10 oder neuer klappt das nicht mehr. Der Link hat mir leider nicht weitergeholfen.

Rollo62 29. Sep 2021 10:42

AW: Android Intent "Action_Call"
 
Zitat:

Zitat von Phantom1 (Beitrag 1495522)
Danke für deine Antwort. Der Sinn dahinter ist eine art Notfall APP die in bestimmten Situationen automatisch einen Anruf an eine vorher angegebene Person tätigt.

Auf Android 8 funktioniert der Code übrigens auch im Hintergrund, aber bei Android 10 oder neuer klappt das nicht mehr. Der Link hat mir leider nicht weitergeholfen.

Vielleicht könntest Du eine Server-Lösung dazu bauen, so das der Anruf nicht vom Phone selbst initiert werden muss.
Das wird vielleicht eher im Hintergrund laufen, aber auch der Internetzugriff im Hintergrund wird immer stärker reglementiert.

Phantom1 29. Sep 2021 15:12

AW: Android Intent "Action_Call"
 
Zitat:

Zitat von Rollo62 (Beitrag 1495540)
Vielleicht könntest Du eine Server-Lösung dazu bauen, so das der Anruf nicht vom Phone selbst initiert werden muss.

Das wäre zwar eine Interessante Lösung, aber ziemlich komplex und warscheinlich auch mit extra kosten verbunden.

Wäre es mit einen ForegroundService nicht möglich einen solchen Intent zu starten? Oder sind ForegroundServices dafür nicht geeignet? Ich habe es zwar bereits versucht, aber die APP stürzt dann einfach ab, vermutlich mache ich da etwas falsch :cry: Die APP die ich erstelle nutzt bereits einen ForegroundService (für GPS) und wenn ich über diesem ForegroundService zb einfach nur eine Webseite öffnen will dann klappt das ebenso nicht:
Code:
procedure TTest.OpenWebsite(const URL: string);
var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setData(StrToJURI(URL));
  Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  TAndroidHelper.Activity.startActivity(Intent);
end;
Irgendwas mache ich da grundsätzlich falsch.

Rollo62 29. Sep 2021 17:16

AW: Android Intent "Action_Call"
 
Zitat:

Zitat von Phantom1 (Beitrag 1495553)
Zitat:

Zitat von Rollo62 (Beitrag 1495540)
Vielleicht könntest Du eine Server-Lösung dazu bauen, so das der Anruf nicht vom Phone selbst initiert werden muss.

Das wäre zwar eine Interessante Lösung, aber ziemlich komplex und warscheinlich auch mit extra kosten verbunden.

Kommt drauf an was genau Du machen willst, ein einfach PHP Server kostet nur ein paar Euro.


Zitat:

Zitat von Phantom1 (Beitrag 1495553)
Oder sind ForegroundServices dafür nicht geeignet? Ich habe es zwar bereits versucht, aber die APP stürzt dann einfach ab, vermutlich mache ich da etwas falsch

Das ist genau was passiert wenn man was macht das dem Phone nicht "gefällt", die App wird einfach gekillt, in der Regel ohne irgendwelche sinnvollen Fehlermeldungen woran es liegt.

Im Foreground ist der Nutzer aktiv an der App, Display ist an, da kannst Du zwar nicht Alles, aber Einiges machen.
Im Background ist die App im Hintergrund, oder sogar das ganze Phone schläft, da ist Alles was Spaß macht nicht mehr erlaubt.
Die Hersteller nennen das Sicherheit :stupid:

Man kann aber für gewisse Dinge im Hintergrund Rechte anfordern, das Thema ist sehr komplex,
soweit ich weiss gibt es da nichts was im Hintergrund "telefoniert", weil ja auch gar kein User an der App ist.
Du könntest z.B. Notifications schicken, und dann die App hochholen, aber das ist auch nicht sehr attraktiv.

Unter Android könnte man Services anlegen, die können Dinge im Hintergrund erledigen.
Unter IOS gibt es die Background-Modes, die z.B. Location, Bluetooth, Audio, etc. explizit erlauben können.
Sowas wie Telefonieren habe ich noch nicht gesehen, eventuell funktionieren EMail oder SMS.

Das generelle Problem ist das im Hintergrund die App nicht mehr weiterläuft ( es sei denn unter Android hat die einen Service zugewiesen ).
Geht die App in de Hintergrund ( über die ApplicationEvents wird das mitgeteilt ) hat man in der Regel nur eine kurze Zeit
um seine dringendsten Aufgaben zu erledigen ( Task abschliessen, Speichern, etc. ), ich glaube maximal 10 Minuten bevor es gekillt wird, wenn es nicht ein für Background vorgesehener Prozess ist, wie oben.

Ausserdem wird bei den Review seit längermen genau darauf geachtet was deine App im Hintergrund macht, und Du musst das
dem Prüfer gut begründen können.
Selbst wenn es technisch laufen sollte kann es durch die Review-Prüfung fliegen.


Edit:
Ach ja, zur Vervollständigung:
Für solche "Meldungen" sind eigentlich die PushNotifications vorgesehen, die auch halbwegs im Hintergrund funktionieren.
Das könnte man z.B. mit Google Firebase anbinden.

Phantom1 29. Sep 2021 20:01

AW: Android Intent "Action_Call"
 
Danke für die Erklärung, die Sache mit der Prüfung im Google Play Store ist mir bewusst. Da sehe ich weniger das Problem :wink:

Ich habe bei meiner Recherche eben noch etwas interessantes dazu gefunden: https://stackoverflow.com/questions/...-screen-is-off

Das passt ganz gut zu meinem Problem und unter Android10 funktioniert das scheinbar auch per ForegroundService, dann funktioniert es vielleicht auch auf Android11.

EDIT:
Ich habs jetzt hinbekommen das der Anruf jetzt auch per ForegroundService funktioniert. Ich musste nur eine kleinigkeit an meinem Code ändern, wie folgt:
Code:
procedure TTestService.CallAPhone(const ANumber: string);
var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_CALL);
  Intent.setData(StrToJURI('tel:' + ANumber));
  Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  TAndroidHelper.Context.startActivity(Intent);    // anstatt TAndroidHelper.Activity.startActivity(Intent);
end;
Ob das jetzt auch unter Android 10 bzw 11 läuft sehe ich dann erst morgen...

Rollo62 30. Sep 2021 06:27

AW: Android Intent "Action_Call"
 
Zitat:

Zitat von Phantom1 (Beitrag 1495562)
Danke für die Erklärung, die Sache mit der Prüfung im Google Play Store ist mir bewusst. Da sehe ich weniger das Problem :wink:

Solltest Du aber, sonst kommt die App nicht in den Store.
Da muss man erklären, dokumentieren, im Zweifel Videos erstellen, Serverzugänge zum Testen bereithalten, etc.
Es kann sein das Google das mal überseieht, aber dann hast du vielleicht beim nächsten Upload das Problem,
wenn Du schon zig Nutzer hast.

Rollo62 30. Sep 2021 06:34

AW: Android Intent "Action_Call"
 
Ja WakeLock funktioniert gut, da muss mann höchstens den erhöhten Stromverbrauch erklären.
Man kann einstellen ob voll oder gedimmte Helligkeit (ich meine bei Android, kann auch bei iOS sein müsste ich jetzt nachsehen).
Das heisst aber die App bleibt immer im Vordergund, wie z.B. Youtube solange ein Film läuft,
kann aber trotzdem durch den Nutzer nach hinten gelegt werden.
Wenn die App so noch Sinn macht ist es das Einfachste.

Ich mache mir da einen Timer-Fallback, wenn die App dann ihre Aufgabe erledigt hat kann sie sich selbst schlafen legen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz