在Android中检索默认日历ID

Gol*_*old 12 android calendar

我有以下代码将事件添加到日历.

问题是我不知道如何检索默认日历ID.

long calID = 3;
long startMillis = 0; 
long endMillis = 0;     
Calendar beginTime = Calendar.getInstance();
beginTime.set(2013, 3, 23, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2013, 3, 24, 8, 45);
endMillis = endTime.getTimeInMillis();

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "My Test");
values.put(Events.DESCRIPTION, "My Calendar Test");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "Israel/tel-aviv");
Uri uri = cr.insert(Events.CONTENT_URI, values);
Run Code Online (Sandbox Code Playgroud)

该行:long calID = 3;是日历ID

是否可以从Android获取默认日历ID,或者我是否需要显示日历列表并让用户选择一个?

如果不可能,如何显示日历帐户列表?

Dmi*_*tri 14

要获取日历列表,您需要像这样查询ContentResolver:

public MyCalendar [] getCalendar(Context c) {

    String projection[] = {"_id", "calendar_displayName"};
    Uri calendars;
    calendars = Uri.parse("content://com.android.calendar/calendars");

    ContentResolver contentResolver = c.getContentResolver();
    Cursor managedCursor = contentResolver.query(calendars, projection, null, null, null);

    if (managedCursor.moveToFirst()){
        m_calendars = new MyCalendar[managedCursor.getCount()];
        String calName;
        String calID;
        int cont= 0;
        int nameCol = managedCursor.getColumnIndex(projection[1]);
        int idCol = managedCursor.getColumnIndex(projection[0]);
        do {
            calName = managedCursor.getString(nameCol);
            calID = managedCursor.getString(idCol);
            m_calendars[cont] = new MyCalendar(calName, calID);
            cont++;
        } while(managedCursor.moveToNext());
        managedCursor.close();
    }
    return m_calendars;

}
Run Code Online (Sandbox Code Playgroud)


Mal*_*ngh 8

我使用以下代码来获取日历 ID。

private fun getCalendarId(context: Context) : Long? {
    val projection = arrayOf(Calendars._ID, Calendars.CALENDAR_DISPLAY_NAME)

    var calCursor = context.contentResolver.query(
        Calendars.CONTENT_URI,
        projection,
        Calendars.VISIBLE + " = 1 AND " + Calendars.IS_PRIMARY + "=1",
        null,
        Calendars._ID + " ASC"
    )

    if (calCursor != null && calCursor.count <= 0) {
        calCursor = context.contentResolver.query(
            Calendars.CONTENT_URI,
            projection,
            Calendars.VISIBLE + " = 1",
            null,
            Calendars._ID + " ASC"
        )
    }

    if (calCursor != null) {
        if (calCursor.moveToFirst()) {
            val calName: String
            val calID: String
            val nameCol = calCursor.getColumnIndex(projection[1])
            val idCol = calCursor.getColumnIndex(projection[0])

            calName = calCursor.getString(nameCol)
            calID = calCursor.getString(idCol)

            Log.d("Calendar name = $calName Calendar ID = $calID")

            calCursor.close()
            return calID.toLong()
        }
    }
    return null
}
Run Code Online (Sandbox Code Playgroud)

所以不要传递 0、1 或 3 作为日历 ID。改用上面的函数。

另外,请检查日历 ID 是否为null,如果为则不要对其进行操作null

        val calendarId = getCalendarId(context)
        if (calendarId != null) {
        //Call operations e.g.: Insert operation
        }
Run Code Online (Sandbox Code Playgroud)


gre*_*lon 5

IS_PRIMARY专栏CalendarContract.CalendarColumns.您使用选择查询:

CalendarContract.CalendarColumns.IS_PRIMARY + "=1"
Run Code Online (Sandbox Code Playgroud)

但是,这是自SDK 17以来