Android 在没有用户确认的情况下将事件添加到日历
我试图编写一个类,在后台将事件添加到用户的日历中(不使用意图)。我需要最终能够在一个循环中添加多达7个事件,因此我无法使用将控制权交给日历供用户确认的方法 不幸的是,我一事无成。我从logcat得到的唯一反馈是一个警告:Android 在没有用户确认的情况下将事件添加到日历,android,calendar,Android,Calendar,我试图编写一个类,在后台将事件添加到用户的日历中(不使用意图)。我需要最终能够在一个循环中添加多达7个事件,因此我无法使用将控制权交给日历供用户确认的方法 不幸的是,我一事无成。我从logcat得到的唯一反馈是一个警告:光标未在关闭前完成() 这其中的大部分都是从一开始的,但它只是不起作用。除了我提到的警告之外,所有这些都“似乎”起了作用,除了日历上没有显示的小细节 如何以常规方式编写getCalendars()查询,以获取用户设备上可能存在的所有日历?现在,你可以看到我仍然拥有android网
光标未在关闭前完成()
这其中的大部分都是从一开始的,但它只是不起作用。除了我提到的警告之外,所有这些都“似乎”起了作用,除了日历上没有显示的小细节
如何以常规方式编写getCalendars()查询,以获取用户设备上可能存在的所有日历?现在,你可以看到我仍然拥有android网站上的语言
感谢您的帮助。多谢各位
编辑:Andrew T指出,由于月份是以零为基础的,所以我有一个逐次错误,所以我将硬编码日期更改为0个月。我还在while
循环之后添加了游标.close()
。然而,我的日历上仍然没有任何东西
我注意到的一件事是,我没有进入而循环。所以我把线圈取了出来。当我将calID变量硬编码为1时,我最终得到了一个日历条目,但这与我有关。我认为获取日历的意义在于用户可以在他们的设备上使用多个日历,而光标是一种在每个日历上迭代的方式。我错了吗
如果将calID硬编码为1可以解决我的问题,我对此没有意见,但我想确保我理解这一点,并且不依赖于临时解决方案。再次感谢 该警告是由于插入事件后未关闭日历光标造成的。调用cursor.close()
将其关闭
还有,你查过二月的活动了吗?我恐怕您对Java的日历中的月份如何工作有一个断断续续的问题。(月份以0开始,这是日历。一月
)
编辑:
似乎getCalendars()
有问题,尤其是字符串选择=…
返回空的光标
。此外,使用这种方法,可能会将事件添加到多个日历中,这可能是不需要的
我的想法是创建一个ListActivity
,列出所有日历,让用户选择要使用的日历。这样,您还可以将日历ID保存到SharedReference
,并在创建事件时方便地使用它
我认为您可以使用cursor=cr.query(uri、EVENT\u PROJECTION、null、null)
列出设备上的所有日历。谢谢。两方面你都是对的。我不想怀疑这几个月是否是零基的。我知道如何让活动出现在我的日历上,但我不相信我的方法对所有情况都足够可靠。我编辑了我的OP来解释我的改变。你觉得我的编辑怎么样?谢谢你的想法。非常有用。关于更改查询参数的建议非常好。对这两个函数使用null解决了问题。你说得对,我需要想出一种方法,允许用户从他们的日历列表中进行选择。谢谢你的帮助!
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class AddToCalendar {
Context context;
// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
public static final String[] EVENT_PROJECTION = new String[] {
Calendars._ID, // 0
Calendars.ACCOUNT_NAME, // 1
Calendars.CALENDAR_DISPLAY_NAME, // 2
Calendars.OWNER_ACCOUNT // 3
};
// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3;
public AddToCalendar (Context context) {
this.context = context;
}
public Cursor getCalendars() {
Cursor cursor = null;
ContentResolver cr = context.getContentResolver();
Uri uri = Calendars.CONTENT_URI;
String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND ("
+ Calendars.ACCOUNT_TYPE + " = ?) AND ("
+ Calendars.OWNER_ACCOUNT + " = ?))";
String[] selectionArgs = new String[] {"sampleuser@gmail.com", "com.google",
"sampleuser@gmail.com"};
// Submit the query and get a Cursor object back.
cursor = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);
return cursor;
}
public void addEvent(Cursor cursor, String type, String location, String description, Date workout_date) {
System.err.println("adding event");
while (cursor.moveToNext()) {
String displayName = null;
String accountName = null;
String ownerName = null;
// Get the field values
long calID = 0;
calID = cursor.getLong(PROJECTION_ID_INDEX);
displayName = cursor.getString(PROJECTION_DISPLAY_NAME_INDEX);
accountName = cursor.getString(PROJECTION_ACCOUNT_NAME_INDEX);
ownerName = cursor.getString(PROJECTION_OWNER_ACCOUNT_INDEX);
System.err.printf("Calendar: %s\n", displayName);
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2014, 1, 26, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2014, 1, 26, 8, 45);
endMillis = endTime.getTimeInMillis();
ContentResolver cr = context.getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, type);
values.put(Events.EVENT_LOCATION, location);
values.put(Events.DESCRIPTION, description);
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
cr.insert(Events.CONTENT_URI, values);
}
}
}