Не удается обновить событие в календаре телефона из кода

Я пытаюсь обновить событие календаря на моем телефоне из моего кода, но контекст.getContentResolver().обновление продолжает возвращать 0, и, конечно, нет никаких изменений в событии, когда я смотрю на него в приложении календаря.

Я получаю идентификатор события, время начала и т. д. При условиях.getContentResolver().запрос, и я получаю уникальные номера, такие как 431, 4, 233 и т. д., Поэтому я предполагаю, что идентификаторы событий, которые я использую, реальны.

Я понимаю официальный способ сделать это это пройти через серверы Google вместо использования update (), но для моей реализации не имеет смысла делать это таким образом (или даже вообще, но я отвлекаюсь).

Я делаю что-то неправильно, или я пытаюсь сделать что-то, что Android просто не позволит?

Uri updateEventUri = ContentUris.withAppendedId(Uri.parse("content://com.android.calendar/events"), id);

ContentValues cv = new ContentValues();
begin.set(Calendar.HOUR_OF_DAY, arg0.getCurrentHour()); //begin is a java.util.Calendar object
begin.set(Calendar.MINUTE, arg0.getCurrentMinute());
//cv.put("_id", id);
//cv.put("title", "yeahyeahyeah!");
cv.put("dtstart", begin.getTimeInMillis());
int updatedrowcount = context.getContentResolver().update(updateEventUri, cv, null, null);
System.out.println("updated "+updatedrowcount+" rows with id "+id);

связанный вопрос был опубликован здесь без ответов https://stackoverflow.com/questions/5636350/update-android-calendar-event

Дайте мне знать, если я могу уточнить что угодно; я был бы очень признателен за любой вклад, который вы, ребята, и куклы могли бы предоставить!

3 ответов


Я много пробовал и, наконец, закончил с решением (ненадежным, хотя).. но работает отлично..

public static boolean updateCalendar(Context context,String cal_Id,String eventId)
    {
    try{

        Uri CALENDAR_URI = Uri.parse(CAL_URI+"events");
        Cursor c = context.getContentResolver().query(CALENDAR_URI, null, null, null, null);
        String[] s = c.getColumnNames();

        if (c.moveToFirst())
        {
                while (c.moveToNext())
            {

                String _id = c.getString(c.getColumnIndex("_id"));
                String CalId = c.getString(c.getColumnIndex("calendar_id"));            
                if ((_id==null) && (CalId == null))
                {
                                 return false;
                }
                else
                {
                    if (_id.equals(eventId) && CalId.equals(cal_Id))
                                 {
                        Uri uri = ContentUris.withAppendedId(CALENDAR_URI, Integer.parseInt(_id));
                        context.getContentResolver().update(uri, null, null, null);// need to give your data here
                        return true;
                    }
                }
            }
        }


    }
    finally
    {
        return true;
    }
    }

и, наконец, я не уверен, если это работает с каждым устройством.


ОК, Итак, проблема заключалась в том, что я использовал разные URI между выборкой событий и их редактированием. Я использовал образец кода из здесь и использовал URI " content: / / com.андроид.календарь / экземпляры / когда", чтобы получить события и отобразить их на экране. Когда я внес изменения, я использовал " content: / / com.андроид.календарь/события" для редактирования по ID как в моем примере выше.

что я нашел, благодаря вашему ответу, ntc, было то, что идентификаторы для событий между два Ури были разными, и поэтому я не мог редактировать события в соответствии с информацией, которую каждый из них давал мне. Я предполагал, что идентификаторы событий, которые я получал, были системными идентификаторами и универсальными для телефона.

Я думаю, мне придется провести некоторое тестирование и посмотреть, какое оборудование несовместимо с этим методом. Я использую HTC Evo для тестирования и до сих пор так хорошо.


при опросе Instances таблицы Instances.EVENT_ID чтобы получить идентификатор события, которое вы хотите изменить, вместо Instances._ID.