2017-02-09 4 views
2

Ich versuche, Telefonstatus geändert Hörer in Service zu erstellen. Mein Service erweitert den Basic Service um keinen IntentService oder ähnliches.Telefonstatus geändert Listener nie abgefeuert

Receiver ist einfach BroadcastReceiver, die ich so registrieren:

IntentFilter filter = new IntentFilter(); 
filter.addAction(TelephoneManager.ACTION_PHONE_STATE_CHANGED); 
registerReceiver(receiver, filter); 

jedoch onReceive meinen Receiver nie aufgerufen. Was vermisse ich? Wenn ich zum Beispiel die Filteraktion auf Intent.ACTION_SCREEN_OFF ändere, bekomme ich jedes Mal, wenn ich den Bildschirm ausschalte, onReceive, also denke ich, dass es vielleicht ein Problem in meinem IntentFilter gibt. Ich möchte dies verwenden, um auf eingehende Anrufe, Signalstärke, Änderung der Zellen-ID und all das Zeug zu hören. Ich habe READ_PHONE_STATE Berechtigung in Manifest registriert, so sollte dies kein Problem sein. Mein Gerät ist Nexus 5X mit Android 6.0.1

Irgendwelche Ideen?

+0

Welches SDK-Ziel haben Sie in Ihrer Gradle-Datei? Ist es 23 oder höher? –

+0

Ziel ist 25 und min ist 23 – horin

+0

Stellen Sie sicher, dass Sie Ihren Dienst und Broadcast-Empfänger in Ihrer Manifest-Datei hinzugefügt haben –

Antwort

3

Wenn Sie von einer Android-Dokumentation versuchen, eine gefährliche Berechtigung zu verwenden, müssen Sie Zugriff darauf anfordern. Sehen Sie hier den Unterschied zwischen den Berechtigungen Dangerous und Normal: Requesting Permissions - Normal and Dangerous Permissions.

Informationen zum Anfordern der Berechtigungen: Requesting Permissions at Run Time.

Eine schnelle Problemumgehung wird sein, Ihre Ziel-API auf 22 (etwas unter 23) zu reduzieren, aber das sollte eine temporäre Lösung sein.

Über Signalstärke, ist es nicht möglich, die Informationen durch Registrierung ACTION_PHONE_STATE_CHANGED zu erhalten. Von Android documentation ist die Funktionalität:

Broadcast-Intent-Aktion, die angibt, dass der Anrufstatus auf dem Gerät geändert hat.

Dies gilt nur für den Anrufstatus (Klingeln, Auflegen usw.), nicht für die Signalstärke. Dies ist sinnvoll, da sich die Signalstärke mehrmals pro Sekunde ändert und diese große Anzahl von Ereignissen pro Sekunde die Batterie sehr schnell entleert.

Vielleicht ist eine Option ein zweistufiger Ansatz: Verwenden Sie PhoneStateListener innerhalb einer Aktivität, wenn Ihre App im Vordergrund ist, und verwenden Sie TelephonyManager.get * CellInfo() alle paar Sekunden im Hintergrund. Siehe auch diese Frage: How to get cell service signal strength in Android?

+0

Dies ist auch kein Problem, da ich dies vorübergehend durch Überprüfung der Phone-Berechtigung in App-Manager gelöst habe und wenn ich es mit PackageManager testen, sagt, dass READ_PHONE_STATE gewährt – horin

+0

Haben Sie versucht, zu zwingen, Ihre zu stoppen App nach dem manuellen Überprüfen der Erlaubnis und neu starten, um sicherzustellen, wenn der Aufruf abgeschlossen ist, ist die Erlaubnis bereits gesetzt? –

+0

ja ich habe es getan. Wie ich sagte, ich überprüfe Erlaubnisstatus vor der Registrierung Empfänger und System sagt, dass es gewährt wird – horin

Verwandte Themen