Android 创建日历事件总是作为生日

Posted

技术标签:

【中文标题】Android 创建日历事件总是作为生日【英文标题】:Android Create Calendar Event always as Birthday 【发布时间】:2016-03-03 15:28:26 【问题描述】:

我以编程方式创建日历事件时遇到一个奇怪的问题 它总是标注为生日日历(类型)我不知道为什么它会这样标注。

我使用的代码如下: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);

请问有人有任何提示或想法可以为我指明正确的方向吗?

提前致谢。

【问题讨论】:

【参考方案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。

【讨论】:

终于在浪费了好几个小时来找到我的问题的解决方案之后......终于你的代码解决了我的问题......非常感谢。 需要 android.permission.READ_CALENDAR【参考方案2】:

Pkosta 指向正确的方向。 您必须取第一个既是VISIBLE 又是IS_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;

【讨论】:

cur.getLong(CalendarContract.Calendars._ID);这是错误的。它应该是 - int index = cur.getColumnIndex(CalendarContract.Calendars._ID); calId = cur.getLong(index);【参考方案3】:

下面回答的问题是老问题,请参考Pkosta's的回答,它提供了更准确的答案...

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

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

改成

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

它为我解决了同样的问题。

【讨论】:

以上是关于Android 创建日历事件总是作为生日的主要内容,如果未能解决你的问题,请参考以下文章

每年将生日事件添加到 jQuery 完整日历中

javascript——easyui日历控件问题

有没有一种想iphone的那种日历 可以添加生日或者重要的日期 然后可以显示距离还有多少天的app

如何使用 android 使用日历 API 在谷歌日历上添加事件?

日历事件 UI android

如何使用android中的回收器视图将事件放在日历中[重复]