我的应用程序中有一个事件列表。侧面的按钮可让用户将事件日期和时间添加到他/她的日历中。我使用日历意图将用户重定向到相应日期和时间的 android 日历。现在,在用户将事件添加到他的日历后,我想禁用与他/她已经添加的事件相对应的“添加事件”按钮(因此用户避免再次添加相同的事件)。我怎样才能做到这一点?我已经完成了 android 4.0 的新日历 API,但我无法实现我想要的。
基本上我想要的是避免在用户日历中重复输入同一事件。
任何帮助,将不胜感激。
我的应用程序中有一个事件列表。侧面的按钮可让用户将事件日期和时间添加到他/她的日历中。我使用日历意图将用户重定向到相应日期和时间的 android 日历。现在,在用户将事件添加到他的日历后,我想禁用与他/她已经添加的事件相对应的“添加事件”按钮(因此用户避免再次添加相同的事件)。我怎样才能做到这一点?我已经完成了 android 4.0 的新日历 API,但我无法实现我想要的。
基本上我想要的是避免在用户日历中重复输入同一事件。
任何帮助,将不胜感激。
您应该测试是否存在此事件的实例。请参阅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 会查找“您的”或“事件”或“标题”!
并且不要忘记包含必要的权限。
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;
}
我已经使用以下方法来检查它......我传递 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;
}
请检查一下,这可能会有所帮助:
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);
}