2012-01-18 13 views
11

Próbuję dodać wydarzenie do kalendarza Androida, a ja określę, że wydarzenie zostanie dodane do kalendarza gmail, aby automatycznie zsynchronizować się z kalendarzem Google. Problem polega na tym, że wydarzenia dodawane programowo nie są zsynchronizowane z kalendarzem Google, ale jeśli dodaję go ręcznie na telefonie, synchronizuje się z kalendarzem Google. Nie wiem dlaczego.Zdarzenie synchronizacji dodane programowo z kalendarzem google w Androidzie

Jest to kod, który używam, aby dodać zdarzenie:

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); 

Więc zdarzenie pomyślnie dodana do kalendarza, ale nie pojawi się w kalendarzu Google w internecie (nie synchronizować) ale jeśli dodaję zdarzenie ręcznie, synchronizuje się !!!

+0

@ mam ten sam problem . Czy rozwiązałeś już swój problem ??? – asish

+2

Masz jakieś rozwiązanie? – mvieghofer

Odpowiedz

2

Spróbuj tego kodu, aby wstawić zdarzenia do kalendarza android jak Kalendarz 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 

Ten kod służy do dodawania zdarzenia sync'ed z kalendarzem 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); 

Uzyskaj URI z Kalendarza, ponieważ różni się poziomem interfejsu API, na przykład do 8, większym niż 8 i większym niż 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

problem nie polega na dodawaniu zdarzenia. Zdarzenie zostało dodane do lokalnego kalendarza i wyświetlane jako zdarzenie z kalendarza google, ale nie w kalendarzu google. – asish

+0

@ashish: sprawdź moją zaktualizowaną odpowiedź –

+1

nadal nie działa .. – asish

1

pomocą kalendarza google api warunkiem here

Powyższe odniesienia jest nieco ogólne, jak Android nie stanowią oficjalnego API. Inne rozwiązanie specyficzne dla Androida to: An Android Tutorial–Programming with Calendar

, który zawiera również działający przykład. Należy także zachować ostrożność w Deklaracji Uprawnienia jak READ_CALENDAR, WRITE_CALENDAR

3

można zsynchronizować zdarzenia po dodaniu go przez tę funkcję, to pracował dla mnie (API 8 i później):

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); 
    } 
Powiązane problemy