2012-09-17 14 views
10

私はいくつかのウェブサイトから取得したイベントを記入するために自分のアカウントにカレンダーを作成しようとしています。私は検索し、私が必要なものを得るために変更したいくつかの新しいアンドロイド4.0カレンダーの例を見つけました。問題はカレンダーが作成され、イベントでいっぱいになるが、Googleカレンダーと同期されないため、次の同期では消去されるということです。私が使用funcionは、これらは以下のとおりです。android apiで新しい同期カレンダーを作成

これはalreay存在しない場合は、新しいカレンダーを追加するためのものである:

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

その1が相互作用することなく、新しいイベントを作成します。

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を取得し、彼らは正しいと思います。アカウントの種類は他の人のために働くようです....

私を助けてくれてありがとう!

「カレンダーは主に同期アダプタによって管理されるように設計されており、新しいカレンダーを挿入同期アダプタとして行われるべきである。」:CalendarContract.CalendarsのJavadocによると

+0

次のように何愚かな質問、あなたはまだ答えを知らないだけのものではありません:) – Codeman

答えて

1

同期アダプタではない場合(あなたが任意のアプリケーションであれば、あなたは同期アダプタではありません)、新しいカレンダーが期待どおりに同期していない理由がわかります。

2

今のところできません。

多くのグーグルで、Gmailアカウント(アカウントタイプ「com.google」)に新しい同期可能なカレンダーを作成する方法が見つかりませんでした。私はこれらのシナリオを試しました:
1. SyncAdapterなしで、同じ動作をします。 - カレンダーは外部のGoogleカレンダーに表示されますが、追加した直後(たとえば数秒後)にすべてのイベントとカレンダーが消えます。
SyncAdapterとcom.googleオーセンティケータと 2 - カレンダーを作成することは可能ではなく、Gmailの新しいアカウントを作成することができます

注アカウント - 私は、プロセス
SyncAdapterとcom.exampleオーセンティケータと3の間にエラーが発生します(SyncAdapterのシナリオ3を使用して)そのアカウント用の新しいカレンダーを作成しますが、Gmailアカウントではないため、カレンダーはGmailカレンダーと同期できません(たとえば、WebブラウザーでGmailアカウントにログインし、表示されません)。

2

APIレベル14任意のアカウントに関連付けられていない カレンダーのための特別なアカウントの種類で追加

ACCOUNT_TYPE_LOCAL

のpublic static final文字列http://developer.android.com/reference/android/provider/CalendarContract.htmlから。通常、デバイスの アカウントと一致しないカレンダーは削除されます。 カレンダーのaccount_typeをこれに設定すると、既存のアカウント と一致しない場合にワイプされません。私が直面していた

2

同じ問題 "LOCAL":

関連項目定数値をACCOUNT_TYPE。以下の変更を行った後、私のイベントを永久に私のカレンダーに固執しています。 addEvent方法で

はasSyncAdapterのために、以下の行

Uri uri = getContentResolver().insert(asSyncAdapter(Events.CONTENT_URI,"[email protected]","com.gmail"), cv); 

コードを追加

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(); 
    } 
関連する問題