我正在尝试实现日历实例查询https://developer.android.com/guide/topics/providers/calendar-provider#query-instances,但是当我运行代码时,我的光标返回null。我删除了选择args,以便它应返回查询范围内的所有实例,但仍然没有运气。我什至将范围设置为回溯2年(其中日历中有很多事件),但它仍然返回null。执行以下代码时,有人会遇到相同的问题吗?
package com.strath.keepfitct.utils;
import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CalendarContract;
import android.util.Log;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;
public class CalendarManager
{
private static final int PERMISSION_REQUEST_CODE = 1;
private static final String DEBUG_TAG = "CalendarManager";
private static final String[] INSTANCE_PROJECTION = new String[]
{
CalendarContract.Instances.EVENT_ID, // 0
CalendarContract.Instances.BEGIN, // 1
CalendarContract.Instances.TITLE, // 2
CalendarContract.Instances.END, // 3
};
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_BEGIN_INDEX = 1;
private static final int PROJECTION_TITLE_INDEX = 2;
private static final int PROJECTION_END_INDEX = 3;
public static void getEvents(Context context)
{
Cursor cursor = null;
ContentResolver contentResolver = context.getContentResolver();
long startTime = LocalDateTime.now().minusMonths(24).toEpochSecond(OffsetDateTime.now().getOffset());
long endTime = LocalDateTime.now().plusHours(24).toEpochSecond(OffsetDateTime.now().getOffset());
Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, startTime);
ContentUris.appendId(builder, endTime);
// String selection = CalendarContract.Instances.EVENT_ID + " = ?";
// String[] selectionArgs = new String[] {"207"};
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CALENDAR)
!= PackageManager.PERMISSION_GRANTED)
{
Log.d("permission", "permission denied to READ_CALENDAR - requesting it");
ActivityCompat.requestPermissions((Activity) context, new String[] {Manifest.permission.READ_CALENDAR}, PERMISSION_REQUEST_CODE);
}
else
{
Log.d("Content URI", builder.build().toString());
cursor = contentResolver.query(builder.build(),
INSTANCE_PROJECTION,
null,
null,
null);
while (cursor.moveToNext())
{
String title = null;
long eventID = 0;
long beginVal = 0;
// Get the field values
eventID = cursor.getLong(PROJECTION_ID_INDEX);
beginVal = cursor.getLong(PROJECTION_BEGIN_INDEX);
title = cursor.getString(PROJECTION_TITLE_INDEX);
// Do something with the values.
Log.i(DEBUG_TAG, "Event: " + title);
LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochSecond(beginVal), TimeZone.getDefault().toZoneId());
Log.i(DEBUG_TAG, "Date: " + date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
}
}
}
}
我的问题是,在将LocalDateTime参数转换为很长的时间后,我没有像预期的那样将它们转换为毫秒!快速乘以1000可解决此问题。
long startTime = LocalDateTime.now().minusMonths(24).toEpochSecond(OffsetDateTime.now().getOffset()) * 1000;