Почему CalendarProvider не получает все события?

Я создаю приложение, которое будет создавать определенный календарь и управлять событиями внутри него.

На данный момент, для целей тестирования, я хочу показать все события, которые у меня есть в моем провайдере, и я делаю это с помощью этого кода:

Cursor cursor = getContentResolver().query(
    CalendarContract.Events.CONTENT_URI,
    new String[]{CalendarContract.Events.TITLE, CalendarContract.Events.DTSTART},
    null, null, 
    CalendarContract.Events.DTSTART
);

Здесь я получаю неожиданное поведение: самое раннее событие, которое я здесь получаю, произошло 16 августа 2015 года, даже если моя программа Google показывает мне события 2014 года. Единственным исключением из них являются повторяющиеся события, которые происходят в этом прошлом году (8 из их против 632 всего)

Почему ContentProvider обрезает мой календарь на 1 год вот так? Как предотвратить это или лучше синхронизировать этот конкретный календарь?

Это поведение где-то задокументировано?


person Dan Chaltiel    schedule 19.08.2016    source источник


Ответы (1)


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

Интеграция приложения календаря Google с телефоном Android.

сначала вы устанавливаете эту строку, которая будет читать события календаря из другого класса из вашего текущего класса, который является ApplicationController.java .

calendar.readCalendar(ApplicationSettings.this);




import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.text.format.DateUtils;

public class ReadCalendar 
{
static Cursor cursor;

public static void readCalendar(Context context) {

    ContentResolver contentResolver = context.getContentResolver();

    // Fetch a list of all calendars synced with the device, their display names and whether the

    cursor = contentResolver.query(Uri.parse("content://com.android.calendar/calendars"),
                (new String[] { "_id", "displayName", "selected"}), null, null, null);

    HashSet<String> calendarIds = new HashSet<String>();

    try
    {
        System.out.println("Count="+cursor.getCount());
        if(cursor.getCount() > 0)
        {
            System.out.println("the control is just inside of the cursor.count loop");
        while (cursor.moveToNext()) {

             String _id = cursor.getString(0);
             String displayName = cursor.getString(1);
             Boolean selected = !cursor.getString(2).equals("0");

            System.out.println("Id: " + _id + " Display Name: " + displayName + " Selected: " + selected);
            calendarIds.add(_id);
        }
    }
    }
    catch(AssertionError ex)
    {
        ex.printStackTrace();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }


    // For each calendar, display all the events from the previous week to the end of next week.        
    for (String id : calendarIds) {
        Uri.Builder builder = Uri.parse("content://com.android.calendar/instances/when").buildUpon();
        //Uri.Builder builder = Uri.parse("content://com.android.calendar/calendars").buildUpon();
        long now = new Date().getTime();

        ContentUris.appendId(builder, now - DateUtils.DAY_IN_MILLIS * 10000);
        ContentUris.appendId(builder, now + DateUtils.DAY_IN_MILLIS * 10000);

        Cursor eventCursor = contentResolver.query(builder.build(),
                new String[]  { "title", "begin", "end", "allDay"}, "Calendars._id=" + 1,
                null, "startDay ASC, startMinute ASC");

        System.out.println("eventCursor count="+eventCursor.getCount());
        if(eventCursor.getCount()>0)
        {

            if(eventCursor.moveToFirst())
            {
                do
                {
                    Object mbeg_date,beg_date,beg_time,end_date,end_time;  

                    final String title = eventCursor.getString(0);
                    final Date begin = new Date(eventCursor.getLong(1));
                    final Date end = new Date(eventCursor.getLong(2));
                    final Boolean allDay = !eventCursor.getString(3).equals("0");

            /*  System.out.println("Title: " + title + " Begin: " + begin + " End: " + end +
                        " All Day: " + allDay);
            */  
                    System.out.println("Title:"+title);
                    System.out.println("Begin:"+begin);
                    System.out.println("End:"+end);
                    System.out.println("All Day:"+allDay);

                /* the calendar control metting-begin events Respose  sub-string (starts....hare) */    

                      Pattern p = Pattern.compile(" ");
                      String[] items = p.split(begin.toString());
                      String scalendar_metting_beginday,scalendar_metting_beginmonth,scalendar_metting_beginyear,scalendar_metting_begindate,scalendar_metting_begintime,scalendar_metting_begingmt;

                      scalendar_metting_beginday = items[0];
                      scalendar_metting_beginmonth = items[1];
                      scalendar_metting_begindate = items[2];
                      scalendar_metting_begintime = items[3];
                      scalendar_metting_begingmt = items[4];
                      scalendar_metting_beginyear = items[5];


                    String  calendar_metting_beginday = scalendar_metting_beginday;
                    String  calendar_metting_beginmonth = scalendar_metting_beginmonth.toString().trim();

                    int  calendar_metting_begindate = Integer.parseInt(scalendar_metting_begindate.trim());

                    String calendar_metting_begintime = scalendar_metting_begintime.toString().trim();
                     String calendar_metting_begingmt = scalendar_metting_begingmt;
                     int calendar_metting_beginyear = Integer.parseInt(scalendar_metting_beginyear.trim());


                      System.out.println("calendar_metting_beginday="+calendar_metting_beginday);

                      System.out.println("calendar_metting_beginmonth ="+calendar_metting_beginmonth);

                      System.out.println("calendar_metting_begindate ="+calendar_metting_begindate);

                      System.out.println("calendar_metting_begintime="+calendar_metting_begintime);

                      System.out.println("calendar_metting_begingmt ="+calendar_metting_begingmt);

                      System.out.println("calendar_metting_beginyear ="+calendar_metting_beginyear);

                      /* the calendar control metting-begin events Respose  sub-string (starts....ends) */  

                    /* the calendar control metting-end events Respose  sub-string (starts....hare) */  

                      Pattern p1 = Pattern.compile(" ");
                      String[] enditems = p.split(end.toString());
                      String scalendar_metting_endday,scalendar_metting_endmonth,scalendar_metting_endyear,scalendar_metting_enddate,scalendar_metting_endtime,scalendar_metting_endgmt;

                      scalendar_metting_endday = enditems[0];
                      scalendar_metting_endmonth = enditems[1];
                      scalendar_metting_enddate = enditems[2];
                      scalendar_metting_endtime = enditems[3];
                      scalendar_metting_endgmt = enditems[4];
                      scalendar_metting_endyear = enditems[5];


                    String  calendar_metting_endday = scalendar_metting_endday;
                    String  calendar_metting_endmonth = scalendar_metting_endmonth.toString().trim();

                    int  calendar_metting_enddate = Integer.parseInt(scalendar_metting_enddate.trim());

                    String calendar_metting_endtime = scalendar_metting_endtime.toString().trim();
                     String calendar_metting_endgmt = scalendar_metting_endgmt;
                     int calendar_metting_endyear = Integer.parseInt(scalendar_metting_endyear.trim());


                      System.out.println("calendar_metting_beginday="+calendar_metting_endday);

                      System.out.println("calendar_metting_beginmonth ="+calendar_metting_endmonth);

                      System.out.println("calendar_metting_begindate ="+calendar_metting_enddate);

                      System.out.println("calendar_metting_begintime="+calendar_metting_endtime);

                      System.out.println("calendar_metting_begingmt ="+calendar_metting_endgmt);

                      System.out.println("calendar_metting_beginyear ="+calendar_metting_endyear);

                      /* the calendar control metting-end events Respose  sub-string (starts....ends) */    

                    System.out.println("only date begin of events="+begin.getDate());
                    System.out.println("only begin time of events="+begin.getHours() + ":" +begin.getMinutes() + ":" +begin.getSeconds());

                    System.out.println("only date begin of events="+end.getDate());
                    System.out.println("only begin time of events="+end.getHours() + ":" +end.getMinutes() + ":" +end.getSeconds());

                    beg_date = begin.getDate();
                    mbeg_date = begin.getDate()+"/"+calendar_metting_beginmonth+"/"+calendar_metting_beginyear;
                    beg_time = begin.getHours();

                    System.out.println("the vaule of mbeg_date="+mbeg_date.toString().trim());
                    end_date = end.getDate();
                    end_time = end.getHours();


                    CallHandlerUI.metting_begin_date.add(beg_date.toString());
                    CallHandlerUI.metting_begin_mdate.add(mbeg_date.toString());

                    CallHandlerUI.metting_begin_mtime.add(calendar_metting_begintime.toString());

                    CallHandlerUI.metting_end_date.add(end_date.toString());
                    CallHandlerUI.metting_end_time.add(end_time.toString());
                    CallHandlerUI.metting_end_mtime.add(calendar_metting_endtime.toString());

                }
                while(eventCursor.moveToNext());
            }
        }
        break;
    }
}
}

каждое событие формирует ваш календарь с помощью этого URL-адреса обратной передачи, который предназначен для версии 2.2 и выше:

Uri.parse("content://com.android.calendar/instances/when").buildUpon();

Пожалуйста, найдите версию ниже 2.2 в Android и используйте эти события по своему усмотрению...

person Riyaz Parasara    schedule 19.08.2016