java - 读取 2 个日期之间的日历事件

标签 java android events calendar

我正在尝试读取 2 个日期之间的日历事件。

我使用 Google 开发人员示例 ( https://developer.android.com/guide/topics/providers/calendar-provider ),但它不起作用。

当然,我在要求的日期有 Activity 。

如果我读取日历的所有事件,它正在工作,所以一个(坏的)解决方案是检查每个返回的事件是否包含在间隔中......

这是我的代码:

    final String[] EVENT_PROJECTION = new String[]{
        CalendarContract.Events._ID,
        CalendarContract.Events.TITLE,
        CalendarContract.Events.DTSTART,
        CalendarContract.Events.DTEND,
    };

    final int PROJECTION_ID_INDEX = 0;
    final int PROJECTION_TITLE_INDEX = 1;
    final int PROJECTION_DTSTART_INDEX = 2;
    final int PROJECTION_DTEND_INDEX = 3;

    Calendar beginTime = Calendar.getInstance();
    beginTime.set(2020, 3, 18, 0, 0);
    long startMillis = beginTime.getTimeInMillis();
    Calendar endTime = Calendar.getInstance();
    endTime.set(2020, 3, 24, 0, 0);
    long endMillis = endTime.getTimeInMillis();

    Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
    ContentUris.appendId(builder, startMillis);
    ContentUris.appendId(builder, endMillis);

    String selection = CalendarContract.Instances.CALENDAR_ID + " = " + calID;

    if (ActivityCompat.checkSelfPermission(this, permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED) {
        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(builder.build(), EVENT_PROJECTION, selection, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                Log.i (TAG, "ID=" + cursor.getLong(PROJECTION_ID_INDEX) + " Title=" + cursor.getString(PROJECTION_TITLE_INDEX));
            }
            cursor.close();
        }
    }

构建器已正确初始化(类似于:“content://com.android.calendar/instances/when/1584486000000/1584918000000”)

下面的代码返回日历的所有事件:

Cursor eventCursor = cr.query(CalendarContract.Events.CONTENT_URI, EVENT_PROJECTION, selection, null, null);

尝试了很多方法还是没有结果...

有人知道为什么失败吗?

谢谢

最佳答案

这是解决方案,不完全是来自 Google 的代码...

final String[] EVENT_PROJECTION = new String[]{
    CalendarContract.Events._ID,
    CalendarContract.Events.TITLE,
    CalendarContract.Events.DTSTART,
    CalendarContract.Events.DTEND,
};

final int PROJECTION_ID_INDEX = 0;
final int PROJECTION_TITLE_INDEX = 1;
final int PROJECTION_DTSTART_INDEX = 2;
final int PROJECTION_DTEND_INDEX = 3;

Calendar beginTime = Calendar.getInstance();
beginTime.set(2020, 3, 18, 0, 0);
long startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2020, 3, 24, 0, 0);
long endMillis = endTime.getTimeInMillis();

String where = "((dtstart >= " + startMillis + ") AND (dtstart <= " + endMillis + ") AND (calendar_id = " + calID + "))";

if (ActivityCompat.checkSelfPermission(this, permission.READ_CALENDAR) == PackageManager.PERMISSION_GRANTED) {

    ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query(Events.CONTENT_URI, projection, where, null, null);
    if (cursor != null) {
        while (cursor.moveToNext()) {
            Log.i (TAG, "ID=" + cursor.getLong(PROJECTION_ID_INDEX) + " Title=" + cursor.getString(PROJECTION_TITLE_INDEX));
        }
        cursor.close();
    }

}

关于java - 读取 2 个日期之间的日历事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61024922/

相关文章:

java - String的格式化方法

android - 如何使用 Java 8 在 Android 和桌面(IntelliJ 2018 CE/Gradle)上使用 libGDX 进行开发

jquery - 监听从外部文件加载到 div 的元素上的事件

asp.net - 为什么 WebControl 事件的前缀为 "On"?

java - 使用java中Vector的indexOf()方法来匹配一个成员变量

java - 如何使android日期选择器不允许选择过去的日期

Java:如何用一个替换多个回车?

android - 如何使用加速度计了解我的 Android 设备的移动速度?

Android 下载多个文件并在 ListView 中显示进度

javascript - 在 dat.gui 中开始更改事件