2012-01-18 16 views
11

Tôi đang cố gắng thêm sự kiện vào lịch trên Android và tôi chỉ định rằng sự kiện sẽ được thêm vào lịch gmail để đồng bộ hóa với lịch Google một cách tự động. Sự cố là sự kiện được thêm vào theo chương trình không đồng bộ hóa với lịch Google, nhưng nếu tôi thêm hướng dẫn sử dụng trên điện thoại, nó sẽ đồng bộ hóa với lịch Google. Tôi không biết tại sao.sự kiện đồng bộ được thêm lập trình với lịch google trong android

Đây là mã mà tôi sử dụng để thêm sự kiện:

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

Vì vậy, sự kiện này thêm thành công lịch nhưng nó không hiển thị trong lịch Google tại web (không đồng bộ) nhưng nếu tôi thêm sự kiện theo cách thủ công thì nó sẽ đồng bộ hóa !!!

+0

@ Tôi có cùng một vấn đề . Bạn đã giải quyết được vấn đề của mình chưa ??? – asish

+2

Bạn có giải pháp nào chưa? – mvieghofer

Trả lời

2

Hãy thử mã này để chèn một sự kiện vào lịch android cũng như google lịch:

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 

Mã này được sử dụng để thêm sự kiện sync'ed để google lịch

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

Nhận Uri của Lịch vì nó khác với các cấp API như cho đến 8, lớn hơn 8 và lớn hơn 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

vấn đề không phải là với sự kiện thêm sự kiện. Đã được thêm vào lịch địa phương và hiển thị dưới dạng sự kiện của lịch Google, nhưng không phải trong lịch google. – asish

+0

@ashish: kiểm tra câu trả lời cập nhật của tôi –

+1

vẫn không hoạt động .. – asish

1

Sử dụng google lịch api cung cấp here

Các tài liệu tham khảo trên là hơi nói chung như Android không cung cấp một API chính thức. Vì vậy, một giải pháp khác dành riêng cho Android là An Android Tutorial–Programming with Calendar

có chứa ví dụ hoạt động. Ngoài ra, hãy cẩn thận tại Tuyên Permission như READ_CALENDAR, WRITE_CALENDAR

3

Bạn có thể đồng bộ hóa sự kiện của bạn sau khi thêm nó bằng chức năng này, Nó làm việc cho tôi (trong API 8 và sau):

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