2016-05-26 21 views
0

カレンダーにすべての曜日のイベントを挿入するようにします。私はhttps://developer.android.com/guide/topics/providers/calendar-provider.htmlで与えられた例で始めました。これを終日使用するには、ALL_DAYのコンテンツ値を追加し、タイムゾーンをUTCに設定します。私はfolowingコードで終わる:Androidカレンダープロバイダを使用して終日イベントを作成する

long calID = 3; 
long startMillis = 0; 
long endMillis = 0;  
Calendar beginTime = Calendar.getInstance(); 
beginTime.set(2012, 9, 14, 7, 30); 
startMillis = beginTime.getTimeInMillis(); 
Calendar endTime = Calendar.getInstance(); 
endTime.set(2012, 9, 14, 8, 45); 
endMillis = endTime.getTimeInMillis(); 

ContentResolver cr = getContentResolver(); 
values.put(Events.ALL_DAY, 1) 
ContentValues values = new ContentValues(); 
values.put(Events.DTSTART, startMillis); 
values.put(Events.DTEND, endMillis); 
values.put(Events.TITLE, "Jazzercise"); 
values.put(Events.DESCRIPTION, "Group workout"); 
values.put(Events.CALENDAR_ID, calID); 
values.put(Events.EVENT_TIMEZONE, "UTC"); 
Uri uri = cr.insert(Events.CONTENT_URI, values); 

は今、これは実際に仕事をしていませんが、DTEND時間が冗長と本当に日付のみが必要な場合に無意味な開始時刻と終了時刻を設定するようです。 DTENDの値を削除すると、例外java.lang.IllegalArgumentException: DTEND and DURATION cannot both be null for an event.が発生します。適切な値は何でしょうか?上記のように恣意的であるか、またはこれは実際に意味のある情報で行うことができますか?

答えて

1

DTENDは、イベントの終了を指定するため、冗長ではありません。 終日は、それがちょうど1日であることを意味しません。それは任意の日数に及ぶ可能性があります。 終日は、イベントの開始と終了に時間コンポーネントがないことを意味します。特に、その日の実際のタイムゾーンに関係なく、その日が始まると常にイベントが始まります。よくある例はあなたの誕生日です。あなたは通常、あなたがどこにいるかにかかわらず、特定の暦日にそれを祝います。

AndroidのカレンダーデータベースDTSTARTおよびDTENDは、その特定の日の午前0時をUTCで表す必要があります。

だから、開始日と終了日を導出するより良い方法は、次のようになります。

TimeZone utc = TimeZone.getTimeZone("UTC"); 
Calendar beginTime = Calendar.getInstance(utc); 
// set all values to 0 
beginTime.clear(); 
beginTime.set(2012, 9, 14); 
startMillis = beginTime.getTimeInMillis(); 

Calendar endTime = Calendar.getInstance(utc); 
// the event ends right before the next day begins 
endTime.clear(); 
endTime.set(2012, 9, 15); 
endMillis = endTime.getTimeInMillis(); 

DTENDが(それはイベント後の最初の瞬間を指す)非包括的であることに注意してください。 1日の終日イベントの場合は、DTENDが翌日の開始です。

イベントの終了を決定する別の方法は、そうのようDTSTARTにイベントの持続時間を追加することによってである:

// Add the duration of 1 day to startMillis to get the end 
endMillis = startMillis + TimeUnit.DAYS.toMillis(1); 

結果は上記と同様です。

これは、非定期イベントを作成する方法です。繰り返しイベントを作成する場合は、DTENDではなく、DURATIONと設定してください。

+0

優れた答えです。ありがとうございました。 – jerry

1

あなたはDURATIONを使用しているときDTENDを使用しないでください、または例外がスローされます第二のparamフォーマットはRFC5545

values.put(CalendarContract.Events.DURATION, "PT1D"); 

を参照してくださいCalendarContract.Events.DURATION

でCalendarContract.Events.DTENDを置き換えます両方DTENDを持つことはできませんDURATION in event

+0

ありがとうございます。有用な追加情報ですが、本当に質問に答えていません。 – jerry

関連する問題