Как выбрать календарь для извлечения событий из API поставщика календаря Android 4.0?

Я писал что-то вроде приложения для будильника, пока что только для себя, но я могу выложить его бесплатно, если кому-то нужно, когда оно будет готово. В любом случае, я попал в тупик. Все, что я хочу от календаря, — это следующее событие в календаре пользователя, чтобы я мог отображать заголовок, время, время до и место.

Вот что у меня есть:

    //get cursor to first row of table of events
        mCursor = getContentResolver().query(
        CalendarContract.Events.CONTENT_URI, COLS, null, null, null);
        mCursor.moveToFirst();

        //variables; title, startdate in miliseconds, etc
        String nextAppointmentTitle = "N/A";
        Long start = 0L;            //tf(start) for appointmentTime
        String timeUntilNextAppointment = "N/A";
        String nextAppointmentLocation = "N/A";


        Format df = DateFormat.getDateFormat(this);
        Format tf = DateFormat.getTimeFormat(this);
        try {
        nextAppointmentTitle = mCursor.getString(0);
        start = mCursor.getLong(1);
        } catch (Exception e) {
        //ignore for the time being
        }


        //create a date object for the time of the event
        GregorianCalendar appointmentTime = (GregorianCalendar) GregorianCalendar.getInstance();
        appointmentTime.setTimeInMillis(start);
        //create date object for current time       
        GregorianCalendar now = (GregorianCalendar) GregorianCalendar.getInstance();

        //get the time from current time until start of event
        long millisUntilNextMeeting = (long) appointmentTime.getTimeInMillis() - (long) now.getTimeInMillis();
        GregorianCalendar timeUntilNextMeeting = (GregorianCalendar) GregorianCalendar.getInstance();
        timeUntilNextMeeting.clear();
        timeUntilNextMeeting.setTime(new Date(millisUntilNextMeeting));

        millisUntilNextMeeting= (millisUntilNextMeeting/1000) /60;

        if (timeUntilNextMeeting.get(GregorianCalendar.HOUR_OF_DAY) > 0) {
            int hours = timeUntilNextMeeting.get(GregorianCalendar.HOUR_OF_DAY) + 6;
            timeUntilNextAppointment = "" + hours + " hours";
        } else {
            timeUntilNextAppointment = "" + timeUntilNextMeeting.get(GregorianCalendar.MINUTE) + " minutes";
        } 
// ... do things with values

Вместо того, чтобы показывать мою следующую встречу, он показывает День семьи в Альберте, который, по-видимому, проходит в феврале. Я немного просмотрел свои календари, и оказалось, что он произвольно выбрал мой календарь «Канадские праздники», который Google так любезно добавил в мой телефон, вместо того, в который я на самом деле что-то добавлял. Я не могу понять, как чтобы выбрать правильный календарь, не прибегая к тому, чтобы пользователь каждый раз выбирал его.

Кто-нибудь знает навскидку, как мне получить нужные мне значения из календаря, который я хочу? Я был бы очень признателен за руку.

PS Я знаю, что это приложение не будет работать на устройствах до 4.0, но мне все равно, чтобы тратить еще 4 часа на попытки расшифровать ужасные документы Google API.


person NathanTempelman    schedule 27.10.2012    source источник


Ответы (1)


Сначала найдите нужный календарь, используя константы в CalendarContract.Calendars. Запросите либо NAME, либо CALENDAR_DISPLAY_NAME. Из возвращенной строки получите значение _ID. Используйте это значение для запроса CalendarContract.Events.CALENDAR_ID. Это даст вам все события для календаря, определенные CalendarContract.Events.CALENDAR_ID.

Вы собирали все события для всех календарей.

person Joe Malin    schedule 27.10.2012
comment
Ой ну спасибо. В этом есть смысл. Хотя, наверное, так лучше. Избавляет меня от необходимости создавать какой-то способ для пользователя выбрать тот, который он хочет. Вы знаете, что я мог бы сделать, чтобы просто получить событие, которое произойдет как можно скорее? - person NathanTempelman; 27.10.2012
comment
Эй, @Joe, я сделал это, чтобы записаться на ближайшую встречу: 'while(mCursor.moveToNext()) { if(now.getTimeInMillis() ‹ mCursor.getLong(1) && mCursor.getLong(1) ‹ start) { start = mCursor .получить длинную (1); nextAppointmentTitle = mCursor.getString(0); } }', но теперь он возвращает Хэллоуин, а не один из моих классов. Так что он все еще дает мне даты из моего праздничного календаря. Есть идеи, что мне делать? PS Не могу заставить форматирование кода работать, извините. - person NathanTempelman; 30.10.2012