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 创建日历事件总是作为生日的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种想iphone的那种日历 可以添加生日或者重要的日期 然后可以显示距离还有多少天的app