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.
"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
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! –