使用android api创建新的同步日历

我正在尝试在我的帐户上创建一个日历,以填充我从某些网站获得的事件。 我搜索并发现了一些新的android 4.0日历示例,我已经修改以获得我需要的东西。 问题是日历是创建的,填充了事件但未与谷歌日历同步,因此在下一次同步时它将被删除。 我使用的function是这些:

如果不存在,这是添加新日历的那个:

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编程方面不是很有经验,所以我认为这是一个愚蠢的问题=)我读过账号和账户types必须与存储在Android设备上的账号相同,否则事件被取消。 我从android api获得accountName,我认为他们是正确的。 帐户types似乎适用于其他….

感谢任何帮助我的人!

现在不可能。

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

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

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

public static final String ACCOUNT_TYPE_LOCAL

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

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

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

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(); } 

根据CalendarContract.Calendars的Javadoc:

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

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