使用 Content Provider 获取 Calendar 实例
Using a Content Provider to get Calendar instances
我正在尝试实现日历实例查询 https://developer.android.com/guide/topics/providers/calendar-provider#query-instances 但是当我 运行 代码时我的光标 return 为空。我已经删除了选择参数,因此它应该 return 查询范围内的所有实例,但仍然没有运气。我什至将范围设置为回顾 2 年(日历中有很多事件),但它仍然 return 为空。有没有人在执行下面的代码时遇到同样的问题?
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;
我正在尝试实现日历实例查询 https://developer.android.com/guide/topics/providers/calendar-provider#query-instances 但是当我 运行 代码时我的光标 return 为空。我已经删除了选择参数,因此它应该 return 查询范围内的所有实例,但仍然没有运气。我什至将范围设置为回顾 2 年(日历中有很多事件),但它仍然 return 为空。有没有人在执行下面的代码时遇到同样的问题?
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;