2012-01-18 3 views
11

Я пытаюсь добавить событие в календарь Android, и я указываю, что событие будет добавлено в календарь gmail, чтобы автоматически синхронизировать с календарем Google. Проблема заключается в том, что события, добавленные программным способом, не синхронизируются с календарем Google, но если я добавлю его вручную на телефон, он синхронизируется с календарем Google. Я не знаю почему.событие синхронизации добавлено программно с календарем Google в android

Это код, который я использую, чтобы добавить событие:

ArrayList<MyCalendar> calendars = new ArrayList<MyCalendar>(); 

String[] projection = new String[] { "_id", "name" }; 
Uri calUri = getCalendarURI(false); 
Cursor managedCursor = managedQuery(calUri, projection, "selected=1", 
     null, null); 

String calName = null; 
String calId = null; 
if (managedCursor.moveToFirst()) { 

    int nameColumn = managedCursor.getColumnIndex("name"); 
    int idColumn = managedCursor.getColumnIndex("_id"); 
    do { 
     calName = managedCursor.getString(nameColumn); 
     calId = managedCursor.getString(idColumn); 
     calendars.add(new MyCalendar(Integer.parseInt(calId), calName)); 
    } while (managedCursor.moveToNext()); 

} 
Toast.makeText(getBaseContext(), calName + " " + calId, 
     Toast.LENGTH_LONG).show(); 

Calendar cal = Calendar.getInstance(); 
ContentValues event = new ContentValues(); 
event.put("calendar_id", 2); 
event.put("title", "Test Event2"); 
event.put("description", "Hiii Buddy"); 
long startTime = cal.getTimeInMillis(); 
long endTime = cal.getTimeInMillis() + 60 * 60 * 1000; 
event.put("dtstart", startTime); 
event.put("dtend", endTime); 
event.put("allDay", 0); 
event.put("eventStatus", 1);// tentative 0, confirmed 1 canceled 2 
event.put("visibility", 3);// default 0 confidential 1 private 2 
          // public 3 
event.put("transparency", 0);// opaque 0 transparent 1 
event.put("hasAlarm", 1); // 0 false, 1 true 

Uri eventsUri = getCalendarURI(true); 
Uri url = getContentResolver().insert(eventsUri, event); 

Так событие успешно добавлен в календарь, но он не отображается в календаре Google в Интернете (не синхронизировать) но если я добавлю событие вручную, он синхронизируется !!!

+0

@ У меня такая же проблема , Вы решили свою проблему ??? – asish

+2

У вас еще есть решение? – mvieghofer

ответ

2

Попробуйте этот код, чтобы вставить событие в календарь андроида, а также календарь Google:

ContentValues values = new ContentValues(); 

    cal_id = String.valueOf(p1); 
    values.put("calendar_id", p1); 
    values.put("title", title1); 
    values.put("allDay", 0); 
    values.put("dtstart", settime); 
    values.put("dtend", cal.getTimeInMillis()+60*60*1000); 
    values.put("description", desc1); 
    values.put("visibility", 0); 
    values.put("transparency", 0); 
    values.put("hasAttendeeData", 1); 
    values.put("hasAlarm", 0); 
    event = cr.insert(EVENTS_URI, values); 
    event1=event; 
    dat1 = event.toString(); 
    long id=-1; 
    if (event != null) 
    { 
     id = Long.parseLong(event.getLastPathSegment()); 
     ContentValues values1 = new ContentValues(); 
     values1.put("event_id", id); 
     values1.put("method", 1); //METHOD_ALERT 

     Uri reminder = Uri.parse(getCalendarUriBase(this) + "reminders"); 
     this.getContentResolver().insert(reminder, values1); 
     if(s.length() > 0 || partmail.length() > 0) 
     { 
    //REQUIRES FOLLOWING CODE 

Этот код используется, чтобы добавить событие в синхронизированы календарь Google

   ContentValues attendees = new ContentValues(); 
      attendees.put("event_id", id); 
      attendees.put("attendeeEmail", partmail1); 
      attendees.put("attendeeRelationship", 2);//RELATIONSHIP_ATTENDEE 
      attendees.put("attendeeStatus", 3); //ATTENDEE_STATUS_INVITED  
      attendees.put("attendeeType", 1); //TYPE_REQUIRED 

      id1=(int)id; 
      alarmid = (int) id; 
      Uri attendeesUri = null; 
      if (Integer.parseInt(Build.VERSION.SDK) >= 8) 
      { 
        attendeesUri = Uri.parse("content://com.android.calendar/attendees"); 
      } 
      else if(Integer.parseInt(Build.VERSION.SDK) < 8) 
      { 
        attendeesUri = Uri.parse("content://calendar/attendees"); 
      } 
      this.getContentResolver().insert(attendeesUri, attendees); 

      Toast.makeText(this, "Task Scheduled Successfully", Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
      Toast.makeText(this, "Could not create Task!", Toast.LENGTH_SHORT);    
     } 


    // reminder insert 
    Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(this) + "reminders"); 
    values = new ContentValues(); 
    values.put("event_id", id); 
    values.put("method", 1); 
    values.put("minutes", 0); 
    cr.insert(REMINDERS_URI, values); 

Получить Uri Calendar, поскольку он отличается для уровней API, таких как до 8, больше 8 и больше 11.

private String getCalendarUriBase(Context con) { 
String calendarUriBase = null; 
Uri calendars = Uri.parse("content://calendar/calendars"); 
Cursor managedCursor = null; 
try { 
    managedCursor = managedQuery(calendars, null, null, null, null); 
} catch (Exception e) { 
    // eat 
} 

if (managedCursor != null) { 
    calendarUriBase = "content://calendar/"; 
} else { 
    calendars = Uri.parse("content://com.android.calendar/calendars"); 
    try { 
     managedCursor = managedQuery(calendars, null, null, null, null); 
    } catch (Exception e) { 
     // statement to print the stacktrace 
    } 

    if (managedCursor != null) { 
     calendarUriBase = "content://com.android.calendar/"; 
    } 

} 

return calendarUriBase; 

}

+0

Проблема заключается не в добавлении события. Событие добавлено в локальный календарь и отображается как событие календаря Google, но не в календаре Google. – asish

+0

@ashish: уточните мой обновленный ответ –

+1

все еще не работает .. – asish

1

С помощью каландра API для Google при условии, here

выше ссылка несколько Android-общем, как не обеспечивает официальный API. Таким образом, еще одно решение, более специфичное для Android, - An Android Tutorial–Programming with Calendar

, который содержит рабочий пример. Кроме того, будьте осторожны в Permission декларации как READ_CALENDAR, WRITE_CALENDAR

3

Вы можете синхронизировать события после добавления этой функции, он работал для меня (в API 8 и выше):

public static void syncCalendar(Context context, String calendarId) { 
     ContentResolver cr = context.getContentResolver(); 
     ContentValues values = new ContentValues(); 
     values.put(CalendarContract.Calendars.SYNC_EVENTS, 1); 
     values.put(CalendarContract.Calendars.VISIBLE, 1); 

     cr.update(
       ContentUris.withAppendedId(getCalendarUri(), 
         Long.parseLong(calendarId)), values, null, null); 
    } 
Смежные вопросы