【问题标题】:Android Create Calendar Event always as BirthdayAndroid 创建日历事件总是作为生日
【发布时间】: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);

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

提前致谢。

【问题讨论】:

    标签: java c# android mobile xamarin


    【解决方案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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2012-01-15
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2022-06-20
      • 1970-01-01
      相关资源
      最近更新 更多