Wie bearbeite ich die Aktion NEW_OUTGOING_CALL während der Schleife?

8

Im Moment entwickle ich eine Anwendung, die die Aktion NEW_OUTGOING_CALL mit Hilfe von BroadcastReceiver abfängt. Ich unterbreche den Anruf, indem ich setResultData(null) anrufe. Danach zeige ich dem Benutzer einen Dialog an, in dem er entscheiden kann, ob er mit meiner Anwendung seine Nummer umschreiben will. Wenn die Benutzerentscheidung gefallen ist, lege ich den neuen Anruf abhängig von der Entscheidung ab. Jetzt wird mein Rundfunkempfänger erneut aufgerufen.

Was ist der richtige Weg, um zu erfahren, dass ich die Nummer bereits bearbeitet habe? Ich habe eine funktionierende Lösung, die einen Zeitstempel verwendet, um zu erraten, ob sie bereits verarbeitet werden könnte. Eine andere Lösung wäre, am Ende der verarbeiteten Zahl ein "+" hinzuzufügen. Diese Methoden funktionieren gut, da meine Anwendung die einzige ist, die das Ereignis NEW_OUTGOING_CALL abfängt. Aber was soll ich tun, wenn andere Anwendungen (wie Sipdroid oder Google Voice) auch dort sitzen und die NEW_OUTGOING_CALL broadcast abbrechen und sie erneut starten? Ich sehe keine Möglichkeit zu erfahren, ob wir noch im selben "Call Flow" sind und ob ich die Nummer schon bearbeitet habe.

Ich würde gerne Ihre Ideen zu diesem Problem hören!

    
and-dev 14.07.2010, 05:41
quelle

4 Antworten

2

Mit welcher API-Ebene arbeiten Sie? Wenn es & gt; = 11 ist, überprüfen Sie die neue BroadcastReceiver.goAsync-Funktion, mit der Sie die Verarbeitung der Übertragung außerhalb der OnReceive-Funktion Ihres Empfängers erweitern können. Dies könnte die Notwendigkeit einer vollständigen Schleife umgehen.

Wenn Sie, wie ich, vor Level 11 versuchen, dies zu tun, ist es erstaunlich schwierig, das elegant zu machen. Möglicherweise haben Sie dies auch getan, aber ich habe versucht, ein "verarbeitete" Flag als Extra in die ACTION_CALL-Absicht aufzunehmen, die mein Code generiert hat, in der Hoffnung, dass es irgendwie in die resultierende ACTION_NEW_OUTGOING_CALL-Sendung aufgenommen wird, aber das funktioniert leider nicht.

Die beste Lösung, die ich finden konnte, ist die Aufnahme eines Fragments in den URI für die ACTION_CALL-Absicht, die Sie generieren. Dieses Fragment wird für die resultierende ACTION_NEW_OUTGOING_CALL-Übertragung einbezogen, sodass Ihr Broadcast-Empfänger zwischen dem ursprünglichen und dem von Ihnen generierten Anruf unterscheiden kann, aber nicht mit Handlern interferiert, die nicht danach suchen.

Hier ist der Basiscode.

In Ihrem BroadcastReceiver für den ACTION_NEW_OUTGOING_CALL

%Vor%

Wenn der Benutzer die Nummer zum ersten Mal wählt, fehlt entweder das Fragment oder Ihre Flagge ist nicht vorhanden. Sie brechen die Übertragung ab und starten Ihre Aktivität. Wenn Sie sich in Ihrer Aktivität dazu entschließen, den Anruf erneut zu tätigen, gehen Sie folgendermaßen vor:

%Vor%

Das "your_flag" -Fragment ist dann in der nachfolgenden NEW_OUTGOING_CALL-Sendung vorhanden und erlaubt Ihnen somit, diesen Fall in Ihrem Rundfunkempfänger anders zu behandeln.

Das Schöne daran ist, dass das Fragment vollständig ignoriert wird, wenn Sie es nicht in der ORIGINAL_URI suchen, damit andere Broadcast-Empfänger weiterhin funktionieren können. Wenn Sie wirklich nett sein wollen, möchten Sie vielleicht nach einem vorhandenen Fragment suchen und ihm Ihr Flag hinzufügen (vielleicht mit einem Komma-Trennzeichen).

Ich hoffe, das hilft. Viel Glück!

    
Scot 20.06.2011, 18:16
quelle
1
  

Ich sehe keine Möglichkeit zu kommen   weiß, ob wir noch im selben "Ruf" sind   fließen "und wenn ich bereits die   Nummer.

Technisch gesehen befinden Sie sich nicht im gleichen "Anrufverlauf", da die Platzierung eines neuen Anrufs asynchron ist. Sie müssen Hinweise (wie einen Zeitstempel) verwenden, wie Sie es bereits zu tun scheinen.

Wenn Sie sicher sind, dass andere Anwendungen die Nummer nicht umschreiben, außer um das Präfix zu ändern oder ein Suffix hinzuzufügen, können Sie einen weiteren "Näherungsüberprüfungs" -Hinweis hinzufügen, um falsche Positive / Negative zu vermeiden über alles, was Sie tun können.

    
Samuel Tardieu 19.09.2010 08:48
quelle
0

Die Methode onReceive () im Broadcast-Empfänger empfängt eine Absicht als Argument. Extrahiere das Bündel aus der Absicht mit Intent.getExtras (). Dieses Paket enthält drei Schlüssel / Wert-Paare wie folgt:

  1. android.phone.extra.ALREADY_CALLED = null
  2. android.intent.extra.PHONE_NUMBER = 98xxxxxx98
  3. android.phone.extra.ORIGINAL_URI = tel: 98xxxxxx98

98xxxxxx98 ist die vom Benutzer gewählte Nummer.

Wenn onReceive () erneut aufgerufen wird, ändert sich diese Zahl in 98xxxxxx98 * oder 0 * Wenn Sie nach dem Sternchen (*) am Ende der gewählten Nummer suchen, kann gefolgert werden, ob die Methode onReceive () das erste Mal oder die nächsten folgenden Male aufgerufen wird.

    
Vaibhav 13.08.2013 08:29
quelle
0

Eine der Antworten wäre, das boolesche Extra in der Absicht zu verfolgen. Ähnliches geschieht in der Google Phone App. Sie können diesen BroadcastReceiver hier überprüfen (Suche nach der bereits verwendeten Verwendung)

Der andere Weg wäre, diese "umgeschriebene" Nummer von Ihrer Sendung an den nächsten Rundfunkempfänger zu senden (kann eine beliebige App sein, wie Sipdroid, Google Voice oder eine benutzerdefinierte VoIP-App), ohne ACTION_CALL aufzurufen (dies Deshalb bekommst du loop und du sendest Empfänger wieder angerufen) Der folgende Code ist ein Beispiel dafür, wie ich Anrufe in meiner eigenen VoIP-App bearbeite. Wenn ich NEW_OUTGOING_CALL in meinem Broadcast-Empfänger abfange, überprüfe ich zuerst, ob eine Internetverbindung besteht. Wenn das Telefon mit dem Internet verbunden ist, verwende ich eine benutzerdefinierte Absichtserklärung meiner Aktivität, um den Anruf über meine VoIP-App zu tätigen. Wenn keine Internetverbindung besteht, stelle ich die ursprüngliche Telefonnummer auf die Ergebnisdaten des Rundfunkempfängers ein. Dies wird vom nächsten Broadcast-Empfänger (wahrscheinlich Standardtelefon-App, muss aber nicht sein) im Flow verwendet, um einen Anruf zu tätigen.

%Vor%     
zekou 01.09.2015 23:30
quelle

Tags und Links