Получить идентификатор календаря по умолчанию в Android
У меня есть следующий код для добавления события в календарь.
Проблема заключается в том, что я не знаю, как получить идентификатор календаря по умолчанию.
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);
Линия: long calID = 3;
- это идентификатор календаря
Можно ли получить идентификатор календаря по умолчанию из Android, или мне нужно показать список календарей и выбрать пользователя?
Если это невозможно, как показать список учетных записей календаря?
Ответы
Ответ 1
Чтобы получить список календарей, вам необходимо запросить 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;
}
Ответ 2
В столбце CalendarContract.CalendarColumns
находится столбец IS_PRIMARY
. Вы запрашиваете с выбором:
CalendarContract.CalendarColumns.IS_PRIMARY + "=1"
Однако это происходит с тех пор, как SDK 17
Ответ 3
В некоторых последних версиях есть проблема, есть список видимых календарей, поэтому ниже приведен код для выбора ПЕРВИЧНОГО календаря, а в старых устройствах этот запрос возвращает 0-запись, поэтому используется второй, если 1-й возвращает 0 записей.
Cursor calCursor = mContext.getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + "=1", null, CalendarContract.Calendars._ID + " ASC");
if(calCursor.getCount() <= 0){
calCursor = mContext.getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1", null, CalendarContract.Calendars._ID + " ASC");
}
Ответ 4
Я использовал следующий код, чтобы получить идентификатор календаря.
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
}
Поэтому не передавайте 0, 1 или 3 в качестве идентификатора календаря. Вместо этого используйте вышеуказанную функцию.
Кроме того, проверьте, является ли ID календаря null
, и не выполняйте операции с ним, если он null
.
val calendarId = getCalendarId(context)
if (calendarId != null) {
//Call operations e.g.: Insert operation
}