Ich versuche eine App wie zu erstellen, wenn ein Anruf an das Telefon kommt, möchte ich die Nummer erkennen. Im Folgenden habe ich versucht, aber eingehende Anrufe werden nicht erkannt.
Ich möchte meinen MainActivity
Hintergrund ausführen . Wie kann ich das tun?
Ich hatte die Erlaubnis in der manifest
Akte gegeben.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Gibt es noch etwas, das ich im Manifest angeben sollte?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);
}
public class myPhoneStateChangeListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == TelephonyManager.CALL_STATE_RINGING) {
String phoneNumber = incomingNumber;
}
}
}
}
Antworten:
Folgendes verwende ich dazu:
Manifest:
Mein wiederverwendbarer Basisrufmelder
Um es dann zu verwenden, leiten Sie einfach eine Klasse daraus ab und implementieren Sie einige einfache Funktionen, je nachdem, welche Aufruftypen Sie interessieren:
Außerdem sehen Sie eine Beschreibung, warum der Code so ist, wie er in meinem Blog ist . Hauptlink: https://gist.github.com/ftvs/e61ccb039f511eb288ee
BEARBEITEN: Auf einfacheren Code aktualisiert, da ich die Klasse für meinen eigenen Gebrauch überarbeitet habe
quelle
lastState
sollte nicht initialisiert werdenCALL_STATE_IDLE
. Ich verpasse nur wenige Anrufe, wenn meine App im aktuellen Status beendet wirdRINGING
. Denn wenn es beim Beenden desIDLE
Anrufs erneut wird , wird die statische Variable neu initialisiertCALL_STATE_IDLE
und es wird entprellt, nichts zu tun. Wir verlieren also den Verweis auflastState
.sich registrieren
und abmelden
quelle
Mit Android P - Api Level 28: Sie benötigen die Berechtigung READ_CALL_LOG
Eingeschränkter Zugriff auf Anrufprotokolle
Android P bewegt die
CALL_LOG
,READ_CALL_LOG
,WRITE_CALL_LOG
undPROCESS_OUTGOING_CALLS
Berechtigungen aus derPHONE
Berechtigungsgruppe in den neuenCALL_LOG
Berechtigungsgruppe. Diese Gruppe bietet Benutzern eine bessere Kontrolle und Sichtbarkeit für Apps, die Zugriff auf vertrauliche Informationen zu Telefonanrufen benötigen, z. B. das Lesen von Anruflisten und das Identifizieren von Telefonnummern.Um Zahlen aus der Absichtsaktion PHONE_STATE zu lesen, benötigen Sie sowohl die
READ_CALL_LOG
Berechtigung als auch dieREAD_PHONE_STATE
Berechtigung . Zum Lesen von ZahlenonCallStateChanged()
benötigen SieREAD_CALL_LOG
nur noch die Berechtigung. Sie benötigen dieREAD_PHONE_STATE
Erlaubnis nicht mehr .quelle
READ_CALL_LOG
inAndroidManifest.xml
Fokus in eine Berechtigungsanfrage auf HinzufügenMainActivity
.UPDATE: Der wirklich großartige Code von Gabe Sechan funktioniert nicht mehr, es sei denn, Sie fordern den Benutzer ausdrücklich auf, die erforderlichen Berechtigungen zu erteilen. Hier ist ein Code, den Sie in Ihre Hauptaktivität einfügen können, um diese Berechtigungen anzufordern:
AUCH: Wie in einem Kommentar unter Gabes Beitrag erwähnt , müssen Sie
android:enabled="true
dem Empfänger einen kleinen Codeausschnitt hinzufügen , um eingehende Anrufe zu erkennen, wenn die App derzeit nicht im Vordergrund ausgeführt wird:quelle
Dies kann Ihnen helfen und auch die erforderliche Berechtigung hinzufügen
quelle
Nur um Gabe Sechans Antwort zu aktualisieren. Wenn Ihr Manifest für Berechtigungen READ_CALL_LOG und READ_PHONE_STATE fragt, wird OnReceive genannt ZWEIMAL . Einer davon enthält EXTRA_INCOMING_NUMBER und der andere nicht. Sie müssen testen, welche es hat und es kann in beliebiger Reihenfolge auftreten.
https://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
quelle
Hier ist eine einfache Methode, mit der die Verwendung
PhonestateListener
und andere Komplikationen vermieden werden können.Also hier erhalten wir die 3 Ereignisse von Android wie
RINGING
,OFFHOOK
undIDLE
. Und um alle möglichen Zustand des Anrufs zu bekommen, müssen wir unsere eigenen Zustände wie definierenRINGING
,OFFHOOK
,IDLE
,FIRST_CALL_RINGING
,SECOND_CALL_RINGING
. Es kann alle Zustände in einem Telefonanruf verarbeiten.Bitte denken Sie so, dass wir Ereignisse von Android empfangen und unsere Bereitschaftszustände definieren. Siehe den Code.
quelle
@ Gabe Sechan, danke für deinen Code. Es funktioniert gut mit Ausnahme der
onOutgoingCallEnded()
. Es wird nie ausgeführt. Testtelefone sind Samsung S5 & Trendy. Ich denke, es gibt 2 Fehler.1: Ein Paar Klammern fehlt.
2:
lastState
wird nicht aktualisiert,state
wenn es am Ende der Funktion ist. Es sollte in der ersten Zeile dieser Funktion durch ersetzt werdenZusätzlich habe ich
lastState
undsavedNumber
in gemeinsame Vorlieben gesetzt, wie Sie vorgeschlagen haben.Habe es gerade mit den obigen Änderungen getestet. Fehler zumindest auf meinen Handys behoben.
quelle
Bitte verwenden Sie den folgenden Code. Es wird Ihnen helfen, die eingehende Nummer mit anderen Anrufdetails zu erhalten.
activity_main.xml
MainActivity.java
und in Ihrer offensichtlichen Anfrage nach folgenden Berechtigungen:
quelle
Sie benötigen einen BroadcastReceiver für
ACTION_PHONE_STATE_CHANGED
Dies ruft Ihren Empfänger an, wenn sich der Telefonstatus von Leerlauf, Klingeln, Abheben vom vorherigen Wert und dem neuen Wert, den Sie erkennen können, wenn es sich um einen eingehenden / ausgehenden Anruf handelt, ändert.Erforderliche Erlaubnis wäre:
Wenn Sie jedoch auch EXTRA_INCOMING_NUMBER in dieser Sendung empfangen möchten, benötigen Sie eine andere Berechtigung: "android.permission.READ_CALL_LOG"
Und der Code ungefähr so:
und in der Empfängerklasse können wir den aktuellen Status erhalten, indem wir die Absicht wie folgt lesen:
Das Ergebnis von Extras könnte sein:
Bei PHONE_STATE-Broadcasts müssen wir weder die Berechtigung PROCESS_OUTGOING_CALLS noch die veraltete Aktion NEW_OUTGOING_CALL verwenden.
quelle