2016-03-03 45 views
1

我有一个奇怪的问题,当我编程方式创建日历事件 它始终注意生日日历(型)我没有,为什么它注意到这样的任何线索。Android的创建日历事件始终作为生日

我的代码使用的是如下:Xamarin C#

ContentResolver cr = ((Activity)Forms.Context).ContentResolver; 
ContentValues values = new ContentValues(); 
String eventUriString = "content://com.android.calendar/events"; 

//Insert Events in the calendar... 
values.Put(CalendarContract.Events.InterfaceConsts.CalendarId, 1); 
values.Put(CalendarContract.Events.InterfaceConsts.Title, title); 
values.Put(CalendarContract.Events.InterfaceConsts.Status, 1); 
values.Put(CalendarContract.Events.InterfaceConsts.Description, description); 
values.Put(CalendarContract.Events.InterfaceConsts.Dtstart, GetDateTimeMS(year, month, day, hour, minute)); 
values.Put(CalendarContract.Events.InterfaceConsts.Dtend, GetDateTimeMS(year, month, day, hour, minute)); 
values.Put(CalendarContract.Events.InterfaceConsts.AllDay, allday ? "1" : "0"); 
values.Put(CalendarContract.Events.InterfaceConsts.HasAlarm, hasalarm ? "1" : "0"); 
values.Put(CalendarContract.Events.InterfaceConsts.EventColor, Android.Graphics.Color.Green); 
values.Put(CalendarContract.Events.InterfaceConsts.EventTimezone, "GMT+" + zone + ":00"); 
values.Put(CalendarContract.Events.InterfaceConsts.EventEndTimezone, "GMT+" + zone + ":00"); 
cr.Insert(Android.Net.Uri.Parse(eventUriString), values); 

请确实有人有任何建议或想法至极可以点我正确的方向?

在此先感谢。

回答

0

您必须将CalendarId值设置为3而不是1,这是默认生日日历。 例如

values.Put(CalendarContract.Events.InterfaceConsts.CalendarId, 1); 

将其更改为

values.Put(CalendarContract.Events.InterfaceConsts.CalendarId, 3); 

它解决了同样的问题对我来说。

1

某些设备在生日中使用日历id = 1,但通常不会。因此,为了获得特定设备(对应于具有日历应用程序配置的电子邮件ID)正确的日历ID,使用下面的代码:

private int getCalendarId(Context context){ 

    Cursor cursor = null; 
    ContentResolver contentResolver = context.getContentResolver(); 
    Uri calendars = CalendarContract.Calendars.CONTENT_URI; 

    String[] EVENT_PROJECTION = new String[] { 
     CalendarContract.Calendars._ID,       // 0 
     CalendarContract.Calendars.ACCOUNT_NAME,     // 1 
     CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,   // 2 
     CalendarContract.Calendars.OWNER_ACCOUNT,     // 3 
     CalendarContract.Calendars.IS_PRIMARY      // 4 
}; 

    int PROJECTION_ID_INDEX = 0; 
    int PROJECTION_ACCOUNT_NAME_INDEX = 1; 
    int PROJECTION_DISPLAY_NAME_INDEX = 2; 
    int PROJECTION_OWNER_ACCOUNT_INDEX = 3; 
    int PROJECTION_VISIBLE = 4; 

    cursor = contentResolver.query(calendars, EVENT_PROJECTION, null, null, null); 

    if (cursor.moveToFirst()) { 
    String calName; 
    long calId = 0; 
    String visible; 

    do { 
     calName = cursor.getString(PROJECTION_DISPLAY_NAME_INDEX); 
     calId = cursor.getLong(PROJECTION_ID_INDEX); 
     visible = cursor.getString(PROJECTION_VISIBLE); 
     if(visible.equals("1")){ 
      return (int)calId; 
     } 
     Log.e("Calendar Id : ", "" + calId + " : " + calName + " : " + visible); 
    } while (cursor.moveToNext()); 

    return (int)calId; 
    } 
    return 1; 
} 

注意点: IS_PRIMARY_COLOUM这在电子邮件ID,而不是时返回1为假期和节假日。

请参考:https://developer.android.com/reference/android/provider/CalendarContract.CalendarColumns.html#IS_PRIMARY了解详情。

1

Pkosta指向在正确的方向。 你必须采取第一个日历是VISIBLEIS_PRIMARY

long calId = 0; 
String selection = CalendarContract.Calendars.VISIBLE + " = 1 AND " 
+ CalendarContract.Calendars.IS_PRIMARY + " = 1"; 

Uri calendarUri = CalendarContract.Calendars.CONTENT_URI; 
Cursor cur = cr.query(calendarUri, null, selection, null, null); 

if (cur != null && cur.moveToFirst()) { 
    Get the field values 
    calID = cur.getLong(CalendarContract.Calendars._ID); 
} 
if (cur != null) { 
    cur.close(); 
} 

return calId;