我的应用中有一系列事件。侧面的按钮允许用户将事件日期和时间添加到他/她的日历中。我使用日历意图将用户重定向到相应日期和时间的android日历。现在用户将事件添加到他的日历后,我想禁用“添加事件”按钮,该按钮对应于他/她已经添加的事件(因此用户避免再次添加相同的事件)。我怎样才能做到这一点?我已经完成了针对Android 4.0的新日历API,但我无法实现我想要的。
基本上我想要的是避免在用户日历中重复输入相同的事件。
任何帮助都将不胜感激。
答案 0 :(得分:7)
如果存在此事件的实例,则应测试。请参阅documentation of the Android's CalendarContract.Instances class。
尤其是second query method在这种情况下应该会有所帮助。
这个示例是一些代码,我发布在blog post about the CalendarContract provider上 - 根据您的需要略有改动:
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会查找“您的”或“事件”或“标题”!
不要忘记包含必要的权限。
答案 1 :(得分:1)
我使用以下方式检查它...我传递的是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;
}
答案 2 :(得分: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);
}
答案 3 :(得分:0)
不建议在UI线程上运行Instances.query,但是可以通过确保开始和结束时间最小化来有效地完成。
搜索字符串将搜索所有值,而不仅是标题,因此添加循环以检查是否需要精确的字段值。
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;
}