Android 在没有用户确认的情况下将事件添加到日历

Android 在没有用户确认的情况下将事件添加到日历,android,calendar,Android,Calendar,我试图编写一个类,在后台将事件添加到用户的日历中(不使用意图)。我需要最终能够在一个循环中添加多达7个事件,因此我无法使用将控制权交给日历供用户确认的方法 不幸的是,我一事无成。我从logcat得到的唯一反馈是一个警告:光标未在关闭前完成() 这其中的大部分都是从一开始的,但它只是不起作用。除了我提到的警告之外,所有这些都“似乎”起了作用,除了日历上没有显示的小细节 如何以常规方式编写getCalendars()查询,以获取用户设备上可能存在的所有日历?现在,你可以看到我仍然拥有android网

我试图编写一个类,在后台将事件添加到用户的日历中(不使用意图)。我需要最终能够在一个循环中添加多达7个事件,因此我无法使用将控制权交给日历供用户确认的方法

不幸的是,我一事无成。我从logcat得到的唯一反馈是一个警告:
光标未在关闭前完成()

这其中的大部分都是从一开始的,但它只是不起作用。除了我提到的警告之外,所有这些都“似乎”起了作用,除了日历上没有显示的小细节

如何以常规方式编写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);
        }
    }
}