3

我的应用程序中有一个事件列表。侧面的按钮可让用户将事件日期和时间添加到他/她的日历中。我使用日历意图将用户重定向到相应日期和时间的 android 日历。现在,在用户将事件添加到他的日历后,我想禁用与他/她已经添加的事件相对应的“添加事件”按钮(因此用户避免再次添加相同的事件)。我怎样才能做到这一点?我已经完成了 android 4.0 的新日历 API,但我无法实现我想要的。

基本上我想要的是避免在用户日历中重复输入同一事件。

任何帮助,将不胜感激。

4

4 回答 4

7

您应该测试是否存在此事件的实例。请参阅Android 的 CalendarContract.Instances 类的文档

在这种情况下,尤其是第二种查询方法应该会有所帮助。

这个示例是一些代码,我在我的博客文章中发布了有关 CalendarContract 提供程序的内容- 根据您的需要稍作修改:

long begin = // starting time in milliseconds
long end = // ending time in milliseconds
String[] proj = 
      new String[]{
            Instances._ID, 
            Instances.BEGIN, 
            Instances.END, 
            Instances.EVENT_ID};
Cursor cursor = 
      Instances.query(getContentResolver(), proj, begin, end, "\"Your event title\"");
if (cursor.getCount() > 0) {
   // deal with conflict
}

请注意:自纪元以来,时间始终以 UTC 毫秒为单位。因此,您可能必须根据用户的时区进行调整。

最后一个参数应该包含您添加到日历中的事件的标题。保留引号 - 否则 Android 会查找“您的”或“事件”或“标题”!

并且不要忘记包含必要的权限。

于 2012-11-20T11:00:16.503 回答
1

Instances.query 不建议在 UI 线程上运行,但可以通过确保最小化开始和结束持续时间来有效地完成。

搜索字符串将搜索所有值,而不仅仅是标题,因此需要添加一个循环来检查确切的字段值。

public boolean eventExistsOnCalendar(String eventTitle, long startTimeMs, long endTimeMs) {
  if (eventTitle == null || "".equals(eventTitle)) {
    return false;
  }
  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
    return false;
  }
  // If no end time, use start + 1 hour or = 1 day. Query is slow if searching a huge time range
  if (endTimeMs <= 0) {
    endTimeMs = startTimeMs + 1000 * 60 * 60; // + 1 hour
  }

  final ContentResolver resolver = mContext.getContentResolver();
  final String[] duplicateProjection = {CalendarContract.Events.TITLE}; // Can change to whatever unique param you are searching for
  Cursor cursor =
      CalendarContract.Instances.query(
          resolver,
          duplicateProjection,
          startTimeMs,
          endTimeMs,
          '"' + eventTitle + '"');

  if (cursor == null) {
    return false;
  }
  if (cursor.getCount() == 0) {
    cursor.close();
    return false;
  }

  while (cursor.moveToNext()) {
    String title = cursor.getString(0);
    if (eventTitle.equals(title)) {
      cursor.close();
      return true;
    }
  }

  cursor.close();
  return false;
}
于 2019-07-11T20:42:31.120 回答
0

我已经使用以下方法来检查它......我传递 event_id 来检查它是否在日历中......

public boolean isEventInCal(Context context, String cal_meeting_id) {

     Cursor cursor = context.getContentResolver().query(
     Uri.parse("content://com.android.calendar/events"),
       new String[] { "_id" }, " _id = ? ",
       new String[] { cal_meeting_id }, null);

           if (cursor.moveToFirst()) {
                   //Yes Event Exist...
      return true;
     }
     return false;
    }
于 2013-08-07T04:42:59.283 回答
0

请检查一下,这可能会有所帮助:

private static boolean isEventInCalendar(Context context, String titleText, long dtStart, long dtEnd) {

    final String[] projection = new String[]{CalendarContract.Instances.BEGIN, CalendarContract.Instances.END, CalendarContract.Instances.TITLE};
    Cursor cursor = CalendarContract.Instances.query(context.getContentResolver(), projection, dtStart, dtEnd);
    return cursor != null && cursor.moveToFirst() && cursor.getString(cursor.getColumnIndex(CalendarContract.Instances.TITLE)).equalsIgnoreCase(titleText);
}
于 2018-07-03T22:26:36.223 回答