Ich erfahre App-Abstürze auf Oreo Android 8.0/8.1-Geräten, wenn Sie den Kalenderanbieter verwenden. Das Problem tritt nicht auf Geräten auf, auf denen Nougat und darunter ausgeführt wird.Kalenderanbieter: Permission Denial auf Android 8
Permission Denial: reading com.android.providers.calendar.CalendarProvider2 uri content://com.android.calendar/calendars from pid=8522, uid=10197 requires android.permission.READ_CALENDAR, or grantUriPermission()
Was mir ein Rätsel ist, dass Abstürze passieren, obwohl das System fordert persmissions in Laufzeit, sie vom Benutzer bestätigt werden, und sie können in den Systemeinstellungen überprüft werden. Auch das Überprüfen von Berechtigungen vor dem Zugriff (siehe Code unten) hilft nicht. Der Zugang wird bestätigt - und dann abgelehnt.
In meinem AndroidManifest:
<manifest ...>
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<application>
...
</application>
</manifest>
Als Beispiel (das Problem tritt bei anderen Abfragen auch), ich erstelle einen Kalender mit dieser Methode:
public static void createCalendarIfNotExists(android.app.Activity activity) throws SecurityException {
ContentResolver contentResolver = activity.getContentResolver();
// Check if calendar already exists.
String[] projection = new String[]{
CalendarContract.Calendars._ID,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME};
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_CALENDAR) == PackageManager.PERMISSION_GRANTED) {
Cursor cursor = contentResolver.query(CalendarContract.Calendars.CONTENT_URI,
projection,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME + " = ?",
new String[]{CALENDAR_NAME},
null);
if (cursor != null) {
if (cursor.getCount() == 0) {
final ContentValues cv = buildNewCalContentValues(activity);
Uri calUri = buildCalUri();
// Insert the calendar into the database.
contentResolver.insert(calUri, cv);
}
if (!cursor.isClosed()) {
cursor.close();
}
}
}
}
Trotz mit Kalenderberechtigungen Überprüfung ERTEILT Die Abfrage schlägt aufgrund fehlender Berechtigungen fehl (die Anforderung für Berechtigungen erfolgt außerhalb dieser Funktion, die Berechtigungen werden jedoch vor dem Ausführen der Abfrage überprüft).
Warum passiert das und warum scheint es mit Android Version 8 zu geschehen?
Danke. Das macht absolut Sinn. Ich nahm tatsächlich an, dass Schreibberechtigungen wie zuvor Leseberechtigungen enthielten. Es gibt viele Informationen über die Änderungen in API 23, daher muss ich diese Informationen irgendwie verpasst haben. Ich werde versuchen, meine App entsprechend zu aktualisieren und Sie dann zu informieren (Antwort akzeptieren). – jerry
@jerry: "Ich nahm tatsächlich an, dass Schreibberechtigungen wie zuvor Leseberechtigungen enthielten" - vor Android 6.0 und der Umstellung auf das Runtime-Berechtigungsmodell, AFAIK, schreibe * did * lese. Android 6.0 hat das kaputt gemacht ... aber da sie die Berechtigungen in die gleiche Gruppe gesetzt haben, sind Sie mit einem Code fertig geworden, der immer noch funktionierte. Nun, wir müssen genauer sagen, was wir in Bezug auf Berechtigungen wollen. Die UX ändert sich nicht - der Benutzer erhält keine weiteren Berechtigungs-Bestätigungsdialoge. – CommonsWare
Brilliant. Es klappt! – jerry