2017-12-05 3 views
0

Kürzlich stürzt meine App bei der Registrierung eines ContentObserver für den Android CallLog ab (in onCreate eines Service). Dies ist die Art, wie ich es registrieren:Registrieren von ContentObserver für Android CallLog führt zum Absturz

getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, new MyObserver(new Handler())); 

Ein Teil der Stacktrace:

java.lang.RuntimeException: Kann Dienst erstellen nl.xelion.restandroid.service.CallLogChanged: java.lang.SecurityException: Berechtigungsverweigerung: Provider öffnen com.android.providers.contacts.CallLogProvider von ProcessRecord {f73a1ed 7949: nl.my.app.debug/u0a119} (pid = 7949, uid = 10119) erfordert android .permission.READ_CALL_LOG oder android.permission.WRITE_CALL_LOG

...

Verursacht durch: java.lang.SecurityException: Permission Denial: Eröffnung Anbieter ... etc

ich dieses Tutorial verwendet, und es hat funktioniert seit etwa einem Jahr: http://www.adityathakker.com/android-content-observer-react-on-content-change

Ungefähr seit Android O begannen die Abstürze zu erscheinen. Das Javadoc von registerContentObserver sagt etwas in dieser Richtung: Starting in O, all content notifications must be backed by a valid ContentProvider. Also habe ich mich gefragt, ob das das Problem wäre, und wenn ja, wie man es löst?

Wie auch immer, warum klagt es über Berechtigungen für Kontakte, und warum ist das nicht schon mal passiert? Das ergibt für mich keinen Sinn.

ps. Ich verwende Code, der eine Berechtigung für Kontakte erfordert, die im onChange des ContentObservers aufgerufen wird, aber selbst wenn ich diesen Codecode kommentiere, kommt es immer noch zum Absturz.

+1

"Also ich fragte mich, ob dies das Problem wäre" - Ich bezweifle es, angesichts des Fehlers Botschaft. "Warum beschwert es sich über Berechtigungen für Kontakte" - es beschwert sich über Berechtigungen für das Anrufprotokoll ('READ_CALL_LOG' oder' WRITE_CALL_LOG'), je nach Ihrer Frage. "Warum ist das nicht schon einmal passiert?" - Das Herausfinden von Datenänderungen sollte eine gewisse Fähigkeit beinhalten, mit den zugrunde liegenden Daten selbst zu arbeiten. Daher bin ich nicht besonders überrascht, dass, um einen 'ContentObserver' zu registrieren, Sie die notwendigen Berechtigungen haben müssen, um etwas mit diesem Anbieter zu tun. – CommonsWare

+0

Sie haben Recht mit dem Kontaktteil, ich hatte ein ähnliches Problem mit Kontakten Berechtigungen, aber das war nicht der Fall für diesen speziellen Fall. Ich habe beide Situationen gemischt. Ich denke, ich habe den Bug nicht gut genug analysiert, bevor ich ihn hier hingelegt habe, aber es gibt immer noch ein unerwartetes Crash-Verhalten, und ich werde das weiter ausführen, indem ich meine eigene Frage beantworte. Danke für die Kommentare! –

Antwort

1

Das Problem liegt in der Aktualisierung auf Android O. Permissions are grouped together und seit Android 0 permission behaviour was changed wegen falscher Behandlung von Berechtigungsanfragen.

In meinem Beispiel habe ich die Berechtigungen hinzugefügt READ_CALL_LOG/WRITE_CALL_LOG und CALL_PHONE zum Manifest, aber nur CALL_PHONE beim ersten Start der App angefordert. Dies führte dazu, dass die Berechtigungsgruppe PHONE akzeptiert wurde, aber keine der Berechtigungen für das Anrufprotokoll. Als die Methode registerContentObserver aufgerufen wurde, akzeptierte Android implizit die Verwendung, da die Gruppe PHONE akzeptiert wurde.

Wenn mein Benutzer von N auf O aktualisiert und registerContentObserver wurde erneut aufgerufen, würde es (mit Recht) abstürzen. Lösung: Überprüfen Sie vor dem Aufruf der registerContentObserver auf die READ_CALL_LOG/WRITE_CALL_LOG Berechtigungen.

Workaround für Benutzer auf Android O, die immer noch den alten - Crashing-Code verwenden: Manuell & auf die spezifische Erlaubnis in den Android-Einstellungen der App (so die PHONE Berechtigungsgruppe in diesem Fall).Dies führt dazu, dass alle Berechtigungen in dieser Gruppe akzeptiert werden (oder zumindest die Berechtigungen in der Gruppe, die von der App benötigt werden).

Verwandte Themen