2016-05-26 11 views
0

Ich möchte, dass meine App ganztägige Ereignisse in den Kalender einfügt. Ich fing mit dem Beispiel an, das bei https://developer.android.com/guide/topics/providers/calendar-provider.html gegeben wurde. Um es den ganzen Tag zu machen, füge ich den ALL_DAY Inhalt hinzu und setze die Zeitzone auf UTC. Ich am Ende mit dem Folowing Code:Erstellen ganztägiger Ereignisse mit Android-Kalenderanbieter

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

Nun, dies macht tatsächlich den Job aber die DTEND Zeit scheint überflüssig und Einstellung Start- und Endzeiten bedeutungslos, wenn es wirklich nur das Datum benötigt wird. Wenn ich den DTEND Wert entferne, erhalte ich eine Ausnahme java.lang.IllegalArgumentException: DTEND and DURATION cannot both be null for an event.. Was wären die richtigen Werte? Einfach beliebig wie oben oder könnte/sollte das eigentlich mit aussagekräftigen Informationen geschehen?

Antwort

1

DTEND ist nicht redundant, da es das Ende des Ereignisses angibt. ganztägig bedeutet nicht, dass es nur einen Tag lang ist. Es könnte eine beliebige Anzahl von Tagen umfassen. ganztägig bedeutet Start und Ende des Ereignisses haben keine Zeitkomponente. Insbesondere beginnt das Ereignis immer mit Beginn des Tages, unabhängig davon, in welcher Zeitzone Sie sich gerade befinden. Ein typisches Beispiel ist dein Geburtstag. Normalerweise feierst du es an einem bestimmten Kalendertag, egal wo du gerade bist.

Beachten Sie, dass in Android-Kalender-Datenbank DTSTART und DTEND Mitternacht dieses bestimmten Tages in UTC darstellen sollten.

So ein besserer Weg, um die Start- und Enddaten abzuleiten wäre:

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

Beachten Sie auch, dass DTEND nicht-inclusive ist (er zeigt auf den ersten Moment nach der Veranstaltung). Für einen ganztägigen Ganztagsausflug heißt das: DTEND ist der Start des nächsten Tages.

Ein anderer Weg, um das Ende des Ereignisses zu bestimmen, wird durch die Dauer des Ereignisses zu DTSTART wie so Zugabe:

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

das Ergebnis das gleiche wie oben ist.

Beachten Sie, dass auf diese Weise nicht wiederkehrende Ereignisse erstellt werden. Wenn Sie ein wiederkehrendes Ereignis erstellen, dürfen Sie DTEND aber DURATION nicht festlegen.

+0

Ausgezeichnete Antwort. Vielen Dank. – jerry

1

CalendarContract.Events.DTEND Ersetzen mit CalendarContract.Events.DURATION

Das zweite param Format RFC5545

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

Verwenden Sie keine DTEND sehen, wenn Sie DAUER verwenden, oder es wird eine Ausnahme: nicht beide DTEND haben kann und DAUER in einem Ereignis

+0

Danke. Nützliche zusätzliche Informationen, aber nicht wirklich die Frage zu beantworten. – jerry

Verwandte Themen