2012-09-17 70 views
10

我正在嘗試在我的帳戶上創建一個日曆以填充從某些網站獲取的事件。我搜索並找到了一些新的android 4.0日曆示例,我已修改以獲取所需內容。問題在於日曆已創建,充滿事件但未與Google日曆同步,因此在下一次同步時會將其刪除。我用的是funcion是這些:使用android api創建新的同步日曆

這是一個如果不存在alreay添加新的日曆:

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

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

和一個沒有互動創建新事件

我在Android編程方面經驗不足,所以我認爲這是一個愚蠢的問題=)我讀過的帳戶名和帳戶類型必須與存儲在Android設備上的相同,否則事件將被取消。我從android api獲取accountName,我認爲他們是正確的。帳戶類型似乎適用於其他....

感謝任何人幫助我!

+0

沒有愚蠢的問題,只有那些你還不知道答案:) – Codeman

回答

1

根據的Javadoc CalendarContract.Calendars:

「日曆被設計成一個同步適配器主要是管理和插入新日曆應作爲一個同步適配器」。

如果你不是同步適配器(如果你只是一個任意的應用程序,你不是同步適配器),這可以解釋爲什麼你的新日曆沒有像你期望的那樣得到同步。

2

現在不可能。

經過大量的谷歌搜索,我找不到在Gmail帳戶(帳戶類型爲「com.google」)中創建新的可同步日曆的方法。我試過這些場景:
1.沒有SyncAdapter,我得到的行爲相同 - 日曆顯示在外部Google日曆應用程序中,並伴隨我添加的所有事件,但不久後(例如幾秒鐘後),所有事件和日曆消失。
2. SyncAdapter和com.google認證 - 可以創建日曆但不是在Gmail帳戶

注意,你可以創建新的賬戶 - 我的過程
3. SyncAdapter和com。示例認證過程中得到一個錯誤併爲該帳戶創建新的日曆(使用SyncAdapter,方案3),但它不是Gmail帳戶,因此日曆不能與Gmail日曆同步(例如,如果您在Web瀏覽器中登錄到Gmail帳戶並打開Goog​​le Calendar,那麼您剛創建的日曆將不會顯示)。

2

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

公共靜態最後絃樂ACCOUNT_TYPE_LOCAL

在API級別14一個特殊帳戶類型不 與任何帳戶相關聯的日曆。通常,與設備上的 帳戶不匹配的日曆將被刪除。將 日曆上的account_type設置爲此將防止其與現有帳戶的 不匹配時被擦除。

請參見ACCOUNT_TYPE常數值: 「本地」

2

同樣的問題,我面臨。在做出下面的改變之後,我現在看到這些事件永久地貼在我的日曆上。

addEvent方法中添加以下行

Uri uri = getContentResolver().insert(asSyncAdapter(Events.CONTENT_URI,"[email protected]","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(); 
    }