10

我正在尝试在我的帐户上创建一个日历来填充我从某些网站获得的事件。我搜索并找到了一些新的 android 4.0 日历示例,我已对其进行了修改以获得我需要的内容。问题是日历已创建,充满事件但未与谷歌日历同步,因此在下一次同步时它被删除。我使用的功能是:

如果不存在,这是添加新日历的方法:

public static Uri createCalendarWithName(Context ctx, String name,String accountName) {

            Uri target = Uri.parse(CalendarContract.Calendars.CONTENT_URI.toString());
            target = target.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName)
            .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google").build();

            ContentValues values = new ContentValues();
            values.put(Calendars.ACCOUNT_NAME, accountName);
            values.put(Calendars.ACCOUNT_TYPE, "com.google");
            values.put(Calendars.NAME, name);
            values.put(Calendars.CALENDAR_DISPLAY_NAME, name);
            values.put(Calendars.CALENDAR_COLOR, 0x00FF00);
            values.put(Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_ROOT);
            values.put(Calendars.OWNER_ACCOUNT, accountName);
            values.put(Calendars.VISIBLE, 1);
            values.put(Calendars.SYNC_EVENTS, 1);
            values.put(Calendars.CALENDAR_TIME_ZONE, "Europe/Rome");
            values.put(Calendars.CAN_PARTIALLY_UPDATE, 1);
            values.put(Calendars.CAL_SYNC1, "https://www.google.com/calendar/feeds/" + accountName + "/private/full");
            values.put(Calendars.CAL_SYNC2, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName);
            values.put(Calendars.CAL_SYNC3, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName);
            values.put(Calendars.CAL_SYNC4, 1);
            values.put(Calendars.CAL_SYNC5, 0);
            values.put(Calendars.CAL_SYNC8, System.currentTimeMillis());

            Uri newCalendar = ctx.getContentResolver().insert(target, values);

            return newCalendar;
    }

并且那个人在没有交互的情况下创建了新事件:

public static Uri createEventWithName(Context ctx, long id, String name, String data) {
        long startMillis = 0; 
        long endMillis = 0;     
        int id2=(int)id;
        String[] divisi = data.split("/");
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1]));
        startMillis = beginTime.getTimeInMillis();
        Calendar endTime = Calendar.getInstance();
        endTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1]));
        endMillis = endTime.getTimeInMillis();


        ContentValues cv = new ContentValues();
        cv.put(Events.TITLE, name);
        cv.put(Events.DTSTART, startMillis);
        cv.put(Events.DTEND, endMillis);
        cv.put(Events.CALENDAR_ID, id2);
        Log.d("aggiungo a calendario",Integer.toString(id2));
        cv.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().toString());
        //cv.put(Events.RRULE, "FREQ=DAILY;INTERVAL=2");

        Uri newEvent = ctx.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, cv);
        return newEvent;
}

我在 Android 编程方面不是很有经验,所以我认为这是一个愚蠢的问题 =) 我读过 accountName 和 Account Type 必须与存储在 android 设备上的相同,否则事件将被取消。我从 android api 获得 accountName,我认为它们是正确的。帐户类型似乎适用于其他......

感谢任何帮助我的人!

4

4 回答 4

2

暂时不可能。

经过大量谷歌搜索后,我找不到在 Gmail 帐户(帐户类型“com.google”)中创建新的可同步日历的方法。我已经尝试过这些场景:
1. 没有 SyncAdapter,我得到了相同的行为 - 日历出现在外部 Google 日历应用程序中,所有事件都是我添加的,但不久之后(例如几秒钟后)所有事件和日历都消失了。
2. 使用 SyncAdapter 和 com.google 身份验证器 - 在此过程中出现错误
3. 使用 SyncAdapter 和 com.example 身份验证器 - 可以创建日历但不能在 Gmail 帐户中

请注意,您可以创建新帐户并为该帐户创建新日历(使用 SyncAdapter,方案 3),但它不是 Gmail 帐户,因此日历不能与 Gmail 日历同步(例如,如果您在网络浏览器中登录到 Gmail 帐户并打开 Google 日历您刚刚创建的日历不会显示)。

于 2013-11-01T19:46:06.117 回答
2

我面临同样的问题。现在进行以下更改后,我看到这些事件永久地保留在我的日历上。

addEvent方法中添加以下行

Uri uri =  getContentResolver().insert(asSyncAdapter(Events.CONTENT_URI,"abc@gmail.com","com.gmail"), cv);

asSyncAdapter 的代码如下

 static Uri asSyncAdapter(Uri uri, String account, String accountType) {
        return uri.buildUpon()
            .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
            .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
            .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
     }
于 2014-12-19T15:29:20.697 回答
2

来自http://developer.android.com/reference/android/provider/CalendarContract.html

公共静态最终字符串 ACCOUNT_TYPE_LOCAL

在 API 级别 14 中添加 与任何帐户无关的日历的特殊帐户类型。通常,与设备上的帐户不匹配的日历将被删除。将日历上的 account_type 设置为此将防止它在与现有帐户不匹配时被擦除。

另请参见 ACCOUNT_TYPE 常量值:“LOCAL”

于 2014-05-15T18:40:31.350 回答
1

根据 CalendarContract.Calendars 的 Javadoc:

“日历设计主要由同步适配器管理,插入新日历应作为同步适配器完成。”

如果你不是同步适配器(如果你只是一个任意的应用程序,你就不是同步适配器),这可以解释为什么你的新日历没有像你期望的那样同步。

于 2012-10-22T18:13:10.180 回答