首页 > 解决方案 > 如何修复需要权限 CALENDAR_READ 或 CALENDAR_WRITE?

问题描述

代码显示

引起:java.lang.SecurityException: Permission Denial: 从 ProcessRecord{ad38a2a 30100:com.example.myapplication/u0a231} (pid=30100, uid=10231) 打开提供程序 com.android.providers.calendar.CalendarProvider2 需要 android.permission .READ_CALENDAR 或 android.permission.WRITE_CALENDAR

这是时间线日历视图,它以线性视图显示日历并进行缩放

清单.xml

<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>

MainActivity.java

    calstuff.LoadCalendars();
    Log.d(LogTag, "calendars loaded: " + calstuff.ourCalendars.size());

    calstuff.LoadEvents();
    Log.d(LogTag, "events loaded: " + calstuff.ourEvents.size());

CalStuff.java

     Cursor calCursor = context.getContentResolver().query(uri, 
     projection, Calendars.VISIBLE + " = 1",
            null, Calendars._ID + " ASC");

我希望显示线性日历时间线,日历可以按年-月-周-天缩放,但它显示错误。

标签: javaandroid

解决方案


您需要运行时权限,如下所示:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != 
PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, 
Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[] 
   {Manifest.permission.ACCESS_FINE_LOCATION}, 
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
    } else if (ActivityCompat.checkSelfPermission(this, 
Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, 
Manifest.permission.WRITE_CALENDAR) == PackageManager.PERMISSION_GRANTED) {

        ContentResolver contentResolver = getContentResolver();
        ContentValues contentValues = new ContentValues();
        Uri uri = contentResolver.insert(CalendarContract.Events.CONTENT_URI, contentValues);
    }

我从以下链接复制:

Android 日历检查权限

有关更多信息,请阅读以下链接:

https://developer.android.com/training/permissions/requesting


推荐阅读