Windows Phone erlaubt das Anlegen von Terminen im Kalender des Anwender aus der App heraus – auch ohne Benutzerinteraktion, also ohne Verwendung der Brokered APIs sondern mit dem direkten Zugriff. “Gebrokered” nennen wir ja immer die Zugriffe, die vorsichtshalber noch einmal den Benutzer fragen, ob er die Aktion auch wirklich will.
Für den direkten Zugriff gibt es eine API, die man anzapfen kann, wenn man nur die “Appointment” Capability im App-Manifest gesetzt hat. Das wiederum ist der Handel auf den wir uns als Entwickler einlassen müssen – wer nicht den Broker nutzt, muss zumindest angeben, dass er auf den Kalender zugreifen will – was ja auch fair ist.
Warum ich diesen Blogpost schreibe? Weil ich mal wieder erstaunt bin, wie einfach es ist – seht Euch den Code an:

async private Task CreateCalenderEntry()
        {
            // 1. get access to appointmentstore
            var appointmentStore = await AppointmentManager.RequestStoreAsync(AppointmentStoreAccessType.AppCalendarsReadWrite);

            // 2. get calendar
            var appCustomApptCalendar = await appointmentStore.CreateAppointmentCalendarAsync("MyCalendar");

            // 3. create new Appointment
            var appo = new Windows.ApplicationModel.Appointments.Appointment();

            // appointment properties
            appo.AllDay = true;
            appo.Subject = "Mein Termin";           
            appo.StartTime = DateTime.Now;

            //  4. add
            await appCustomApptCalendar.SaveAppointmentAsync(appo);
        }

Es geht hier also – quasi netto – um 4 Zeilen Code (das Setzen der Appointment Properties zählt nicht, finde ich).
Bitte nicht vergessen die Capability im App Manifest zu setzen:
 image
 
Besteht jetzt die Gefahr, dass eine App den Kalender des Anwenders zumüllt? Ein bisschen schon – allerdings hat der Anwender die Möglichkeit hier den Riegel vorzuschieben. Die App schreibt hier in einen eigenen Kalender, das heißt, der Anwender hat die Möglichkeit diesen Kalender wieder auszublenden. Das funktioniert ganz einfach über die Kalendereinstellungen.
 
imageimage

Besonders erwähnenswert finde ich, dass man mit Windows Phone 8.1 solche Aktionen jetzt auch über Push Notifications triggern kann – d.h. eine App, die nicht im Vordergrund ist, ist auch in der Lage per Push dazu angestoßen zu werden Kalendereinträge vorzunehmen.

Die Asynchronität in der Verarbeitung des Push Events bekommt Ihr in der Run-Methode des Background-Tasks über das Deferral in den Griff:

async public void Run(IBackgroundTaskInstance taskInstance)
  {

BackgroundTaskDeferral deferral = taskInstance.GetDeferral();           
await CreateCalenderEntry();
deferral.Complete();

}

Kleiner Hinweis noch zum Code oben: Wenn Ihr diesen Code mehrfach ausführt, werden mehrere Kalender angelegt. Hier bietet es sich natürlich an, statt CreateAppointmentCalendarAsync bei Bedarf einfach GetAppointmentCalendarAsync zu nutzen.