Page 1 of 4 1 2 3 ... LastLast
Results 1 to 15 of 47

Thread: (Android, FMX) Bellen op de Achtergrond

Hybrid View

  1. #1

    (Android, FMX) Bellen op de Achtergrond

    Is het mogelijk om te bellen op de achtergrond, dus zodat het Form van je App zichtbaar blijft ?
    Met: PhoneDialerService.Call('06-12345678');
    wordt het telefoon nummer gebeld, maar helaas is het Form (met info die ik bij het gesprek nodig heb) dan niet meer te zien (het telefoon scherm wordt dan getoond).

    Ik krijg dit helaas niet gevonden.
    Dus is het mogelijk om op de achtergrond te bellen, of het Form weer te tonen als er bijvoorbeeld verbinding is gemaakt ?
    Last edited by MMSoft; 11-Aug-22 at 16:39.

  2. #2
    Ik dacht eraan om het probleem in 2 stappen op te lossen.

    1: Als er opgenomen wordt aan de andere kant, een Timer starten.
    2: Als deze timer afloopt, dan de App weer, zichtbaar zien te maken.

    Maar het lukt mij helaas al niet om de 1e stap werkend te krijgen, zie bijvoorbeeld:
    https://stackoverflow.com/questions/...edialerservice

    Hoe zou ik kunnen afvragen of er een verbinding tot stand is gekomen ?

  3. #3
    Heb je READ_PRECISE_PHONE_STATE in je manifest staan?

    Ik heb geen ervaring maar zie dat bij het commentaar van een van de links staan in de pagina die jij zelf geeft. Dus niet het commentaar van die pagina zelf maar eerst doorklikken naar die link in het commentaar en dan daar het commentaar lezen.)

  4. #4
    Heb je READ_PRECISE_PHONE_STATE in je manifest staan?
    Ik heb bij Uses Permissions "Read phone state" aangevinkt, maar dat is dus waarschijnlijk niet voldoende.

    Wordt er met "manifest" het bestand "AndroidManifest.template.xml" bedoeld denken jullie ?

    Daarin staat het deel: <%uses-permission%>

    En plaats ik dat dan op deze manier ?

    Code:
        <%uses-permission%>
    	 <permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
             <uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
    En moet ik dan permission of uses-permission gebruiken ?
    Last edited by MMSoft; 17-Aug-22 at 20:18.

  5. #5
    Ik denk dat die "Read phone state" voor READ_PHONE_STATE is.
    Maar als je zoekt op Delphi READ_PHONE_STATE
    Dan is de eerste hit ook weer een stackoverflow vraag "Delphi Android READ_PHONE_STATE not triggering" waar in het commentaar staat dat je ook READ_PRECISE_PHONE_STATE moet hebben.

    READ_PHONE_STATE <> READ_PRECISE_PHONE_STATE

    Ik heb geen idee hoe je dat in een manifest moet zetten dus dat mag iemand anders bekijken.
    (In 1 van de linkjes die je daar kunt volgen kom je bij een antwoord met wat minifest gegevens)

  6. #6
    Zodra het Telefoon scherm getoond wordt, gebeurd er blijkbaar niets meer in mijn App.

    Als test start ik een Timer net voordat er gebeld wordt, en deze timer loopt nooit af.
    Ook niet als het Telefoon scherm weer afgesloten is en de App getoond wordt.

    Code:
    procedure TForm1.Button12Click(Sender: TObject);
    begin
     Timer3.Enabled := True;
     PhoneDialerService.Call('06-12345678');
    end;
    
    procedure TForm1.Timer3Timer(Sender: TObject);
    begin
     Tril_Motor();
     Timer3.Enabled := False;
    end;
    Daarom wordt waarschijnlijk dit ook niet uitgevoerd:
    Code:
    FPhoneDialerService.OnCallStateChanged := MyOnCallStateChanged;
    if TCallState.Connected
    Ik had ergens gelezen dat je een "Thread" moet gebruiken, maar daar heb ik geen ervaring mee.

    Zou er een manier zijn om de App actief te houden ook als het Telefoon scherm getoond wordt ?

  7. #7
    Quote Originally Posted by MMSoft View Post
    Ook niet als het Telefoon scherm weer afgesloten is en de App getoond wordt.
    Code:
    procedure TForm1.Timer3Timer(Sender: TObject);
    begin
     Tril_Motor();
     Timer3.Enabled := False;
    end;
    Hoezo? Loopt je timer ook niet als je app daarna weer actief wordt? Dat zou raar zijn. Want als je app weer op de voorgrond loopt zouden te timers ook gewoon moeten lopen.

    Je moet uiteraard die Timer3.Enabled := false daar weghalen want die disabled je timer.

  8. #8
    Staat achtergrondbeperking en batterijoptimalisatie allebei wel uitgeschakeld voor die App (bij de App settings)?

  9. #9
    Bij de App instelling staat "Batterij", daar heb ik nu gekozen voor:
    "Toestaan dat deze app zonder restricties de batterij gebruik in de achtergrond. Hierdoor kan uw batterij sneller leeg raken"

    Verder vindt ik geen App instellingen zoals je vermeld (Samsung Galaxy M22, Android 12)

    Het probleem blijft hetzelfde na deze wijziging

  10. #10
    De timer is als test bedoeld om enkele seconden nadat het telefoon nummer gedraaid is iets te doen. In dit geval wou ik daarmee de App weer op de voorgrond zien te krijgen, maar helaas blijft deze timer niet lopen als het Telefoon scherm op de voorgrond staat.
    Dat hoeft dus naar 1x te gebeuren nadat het telefoon nummer gedraaid is, en kan de timer weer uitgeschakeld worden.
    Als test laat ik even de tril motor draaien, maar dat gebeurd niet, dus de timer loopt niet door als het telefoon scherm op de voorgrond staat (en de App op de achtergrond).

    Zou een "Thread" wel door blijven draaien op de achtergrond ?

  11. #11
    Dat de timer en jouw app niet draaien als je aan de telefoon bent kan ik me best voorstellen. Je wilt niet gestoord worden tijdens een gesprek.

    Ik weet niet hoe je dat kunt overrulen (als dat al kan).

    Maar jij zei dat als je app weer op de voorgrond kwam, dat de timer ook niet loopt. En dat klopt dus niet. Die zou daarna gewoon weer moeten werken (wat ie waarschijnlijk ook wel doet als je de timer niet op false zet).

    Zover ik weet hangt Android compleet samen met threads. Dus je hele programma bestaat uit threads. Ik zou dus niet weten of een nieuwe thread nou zoveel uit zou maken. Als Android gewoon zegt "jij blijft op de achtergrond" dan zal dat dus zo blijven. Tenzij er een methode is om dit te overrulen. Maar dat weet ik dus niet of die er is.

  12. #12
    Ook de eerste opzet met een Thread werkt niet.

    Het is mijn eerste Thread die ik gemaakt heb, dus er kan mogelijk nog wel het een en ander verbeterd worden
    Deze Thread geeft een vertraging van ca. 5 Sec. en laat dan het trilmotortje even draaien.

    Als ik alleen "Createthreads" start, dan werkt dat goed (na 5 sec. draait het motortje even).
    Maar als ik op Button12 klik, dan verschijnt het Telefoon scherm, en het motortje draait helemaal niet, ook niet als Telefoon scherm afgesloten wordt en de App weer getoond wordt.

    Het lijkt er dus op dat de Thread ook stopt als het Telefoon scherm verschijnt...
    Code:
    procedure TForm1.Button12Click(Sender: TObject);
    begin
     Createthreads;
     PhoneDialerService.Call('06-12345678');
    end;
    
    procedure TForm1.Createthreads;
    begin
     TThread.CreateAnonymousThread(procedure ()
      var
       I: Integer;
       Total: Integer;
      begin
        for I := 0 to 50 do
         begin
          Sleep(100);
         end;
    
        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            Tril_Motor();
          end);
      end).Start;
    end;

    Edit:
    Een Label vullen wordt wel gedaan:

    Code:
        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin
            //Tril_Motor();
            Label1.Text := 'Test';
          end);
      end).Start;
    De Thread lijkt dus "wel" door te lopen, maar er is blijkbaar geen bevoegdheid om het motortje te laten draaien...

    Dus mogelijk is stap 1 nu klaar.

    Hoe kan ik met Code de App weer op de Voorgrond krijgen, en het Telefoon scherm op de achtergrond denken jullie ?
    Last edited by MMSoft; 19-Aug-22 at 10:29.

  13. #13
    Quote Originally Posted by MMSoft View Post
    Als ik alleen "Createthreads" start, dan werkt dat goed (na 5 sec. draait het motortje even).
    Maar als ik op Button12 klik, dan verschijnt het Telefoon scherm, en het motortje draait helemaal niet, ook niet als Telefoon scherm afgesloten wordt en de App weer getoond wordt.
    Het kan goed zijn dat het trillen geblokkeerd wordt.
    Dan wordt je thread dus wel uitgevoerd maar het trillen onderdrukt.

    Je hebt ook geen loop in die thread zitten dus is het logisch dat na terugkeer in je app, de motor niet meer trilt.

    Bouw maar eens een loop in.
    Delphi Code:
    1. repeat
    2.  // sleep(5000)
    3.  // thread voor trilmotor
    4. until false;
    en kijk of die dan binnen 5 seconden na terugkeer weer trilt.

    Tevens had je hier een compleet voorbeeld om te kijken of een app wel op de achtergrond door kan lopen.
    https://blog.marcocantu.com/blog/201...d_threads.html

    Daar staat ook dit:
    Again, you can use the home button, start another application, and your app thread will keep working in the background until it finishes computing the prime numbers. Does this mean we can use a thread to keep an application running (like polling external resources) continuously? That is not true. The user can terminate the application at will (although this might not be very common and will be acceptable), but also the operating system might kill the application if the users starts too many apps or apps consuming a lot of memory and CPU. The operating system has the right to terminate "resource hungry" applications. To make sure an Android apps remains in memory indefinitely, you need to write a server, which is a different type of app Delphi doesn't directly support at this moment.
    Dus als alles niet werkt, en je moet je app echt op de achtergrond door laten werken, dan moet je naar services toe (die toen nog niet door Delphi ondersteund werden).
    Zoeken dit geeft dan ook wel wat resultaten: delphi android fmx service

    Maar om even makkelijk te testen of een TTimer doorloopt tijdens een gesprek kun je ook gewoon dit doen
    TTimer met 1000 interval

    Delphi Code:
    1. var
    2.   MyCounter: Integer = 0;
    3.  
    4. procedure TForm1.Timer1Timer(Sender: TObject);
    5. begin
    6.   Inc(MyCounter);
    7.   Label1.Caption := MyCounter.ToString;
    8. end;
    Dan je gesprek starten en na het gesprek kijken of de MyCounter ook zoveel seconden doorgelopen is.
    Als die zoveel seconden verder is, dan wordt je TTimer gewoon uitgevoerd.
    (en dan is er een andere reden waarom jij geen toegang hebt tot het gesprek)

  14. #14
    Getest, de timer draait netjes door tijdens het gesprek.

    Deze stap 1 is alleen maar bedoeld om even nadat het telefoon nummer is gebeld iets te kunnen doen met code.
    Dat lijkt nu te werken.
    Nu is het de uitdaging om de App weer op de voorgrond te krijgen, dus dat deze zichtbaar is tijdens het gesprek.

    Het is mogelijk dat dit kan, omdat ik wel eens gebeld ben en tijdens dat gesprek andere Apps kon bekijken om iets op te zoeken.
    Ik druk daarvoor dan op het Cirkeltje en start de App die ik dan nodig heb, bovenin het scherm staat dan een heel klein telefoon scherm, en daaronder de geopende App.

    Maar hoe doe je dat met code ?
    Last edited by MMSoft; 19-Aug-22 at 12:00.

  15. #15
    Quote Originally Posted by MMSoft View Post
    Het is mogelijk dat dit kan, omdat ik wel eens gebeld ben en tijdens dat gesprek andere Apps kon bekijken om iets op te zoeken.
    Ja, maar dat doe je dan zelf.
    Heb je ooit tijdens een gesprek een App naar voren gekregen die 'inbrak' op jouw gesprek?

    Je kunt het eens proberen met de alarm-app (die op b.v. 30 seconden zetten en dan een gesprek voeren en kijken of die naar voren komt).
    Als zelfs de alarm-app niet naar voren kan komen, dan denk ik dat het moeilijk zal zijn.

Page 1 of 4 1 2 3 ... LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •