<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=.NET_MAUI%3A_Kalendereintrag_unter_Android_erstellen</id>
	<title>.NET MAUI: Kalendereintrag unter Android erstellen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=.NET_MAUI%3A_Kalendereintrag_unter_Android_erstellen"/>
	<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=.NET_MAUI:_Kalendereintrag_unter_Android_erstellen&amp;action=history"/>
	<updated>2026-10-17T10:12:38Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in maxTechCorner</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://techcorner.max-it.de/index.php?title=.NET_MAUI:_Kalendereintrag_unter_Android_erstellen&amp;diff=4303&amp;oldid=prev</id>
		<title>imported&gt;TechCorner-Redaktion: Neufassung von &quot;Xamarin.Android: Hinzufügen eines Kalendereintrages&quot;: Intent und CalendarContract mit Laufzeitberechtigung</title>
		<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=.NET_MAUI:_Kalendereintrag_unter_Android_erstellen&amp;diff=4303&amp;oldid=prev"/>
		<updated>2026-10-14T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;Neufassung von &amp;quot;Xamarin.Android: Hinzufügen eines Kalendereintrages&amp;quot;: Intent und CalendarContract mit Laufzeitberechtigung&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Steckbrief&lt;br /&gt;
| gilt_fuer   = .NET MAUI 9/10 bzw. .NET for Android; Android 8 bis 16&lt;br /&gt;
| bereich     = Softwareentwicklung&lt;br /&gt;
| dauer       = ca. 20 Minuten&lt;br /&gt;
| rechte      = Entwicklungsumgebung; Variante 2: Kalenderberechtigung des Benutzers&lt;br /&gt;
| stand       = Oktober 2026&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Einen Kalendereintrag unter Android erstellen&amp;#039;&amp;#039;&amp;#039; – etwa für einen Servicetermin aus einer Außendienst-App – geht in .NET MAUI auf zwei Wegen: Am einfachsten öffnet die App den Kalender des Geräts mit vorausgefüllten Daten, und der Benutzer bestätigt. Soll der Termin ohne Rückfrage eingetragen werden, schreibt die App direkt über den &amp;lt;code&amp;gt;CalendarContract&amp;lt;/code&amp;gt; von Android – dafür ist eine Laufzeitberechtigung nötig.&lt;br /&gt;
&lt;br /&gt;
[[Datei:NET-MAUI-Kalendereintrag-Android.png|thumb|center|750px|Kalendereintrag unter Android: per Intent die Kalender-App mit vorausgefülltem Termin öffnen oder mit Laufzeitberechtigung direkt über den CalendarContract schreiben.]]&lt;br /&gt;
&lt;br /&gt;
== Variante 1: Kalender-App mit vorausgefülltem Termin öffnen (empfohlen) ==&lt;br /&gt;
Keine Berechtigung nötig, der Benutzer sieht und bestätigt den Termin. Der Code liegt in &amp;lt;code&amp;gt;Platforms/Android&amp;lt;/code&amp;gt; oder wird mit &amp;lt;code&amp;gt;#if ANDROID&amp;lt;/code&amp;gt; eingeschlossen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#if ANDROID&lt;br /&gt;
using Android.Content;&lt;br /&gt;
using Android.Provider;&lt;br /&gt;
&lt;br /&gt;
public static class AndroidKalender&lt;br /&gt;
{&lt;br /&gt;
    public static void TerminVorschlagen(string titel, string ort, string beschreibung,&lt;br /&gt;
                                         DateTimeOffset beginn, DateTimeOffset ende)&lt;br /&gt;
    {&lt;br /&gt;
        var intent = new Intent(Intent.ActionInsert)&lt;br /&gt;
            .SetData(CalendarContract.Events.ContentUri)&lt;br /&gt;
            .PutExtra(CalendarContract.ExtraEventBeginTime, beginn.ToUnixTimeMilliseconds())&lt;br /&gt;
            .PutExtra(CalendarContract.ExtraEventEndTime, ende.ToUnixTimeMilliseconds())&lt;br /&gt;
            .PutExtra(CalendarContract.Events.InterfaceConsts.Title, titel)&lt;br /&gt;
            .PutExtra(CalendarContract.Events.InterfaceConsts.EventLocation, ort)&lt;br /&gt;
            .PutExtra(CalendarContract.Events.InterfaceConsts.Description, beschreibung);&lt;br /&gt;
&lt;br /&gt;
        Platform.CurrentActivity?.StartActivity(intent);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ToUnixTimeMilliseconds()&amp;lt;/code&amp;gt; ersetzt die früher nötige Hilfsmethode zur Umrechnung von &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; in Millisekunden.&lt;br /&gt;
&lt;br /&gt;
== Variante 2: Termin direkt eintragen ==&lt;br /&gt;
=== Schritt 1: Berechtigungen deklarieren ===&lt;br /&gt;
In &amp;lt;code&amp;gt;Platforms/Android/AndroidManifest.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.READ_CALENDAR&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;uses-permission android:name=&amp;quot;android.permission.WRITE_CALENDAR&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schritt 2: Berechtigung zur Laufzeit anfragen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var status = await Permissions.RequestAsync&amp;lt;Permissions.CalendarWrite&amp;gt;();&lt;br /&gt;
if (status != PermissionStatus.Granted)&lt;br /&gt;
{&lt;br /&gt;
    await Shell.Current.DisplayAlertAsync(&amp;quot;Kalender&amp;quot;,&lt;br /&gt;
        &amp;quot;Ohne Kalenderzugriff kann der Termin nicht eingetragen werden.&amp;quot;, &amp;quot;OK&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für das Ermitteln des Zielkalenders zusätzlich &amp;lt;code&amp;gt;Permissions.CalendarRead&amp;lt;/code&amp;gt; anfragen.&lt;br /&gt;
&lt;br /&gt;
=== Schritt 3: Eintrag schreiben ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
#if ANDROID&lt;br /&gt;
using Android.Content;&lt;br /&gt;
using Android.Provider;&lt;br /&gt;
&lt;br /&gt;
public static long TerminEintragen(long kalenderId, string titel,&lt;br /&gt;
                                   DateTimeOffset beginn, DateTimeOffset ende)&lt;br /&gt;
{&lt;br /&gt;
    var values = new ContentValues();&lt;br /&gt;
    values.Put(CalendarContract.Events.InterfaceConsts.CalendarId, kalenderId);&lt;br /&gt;
    values.Put(CalendarContract.Events.InterfaceConsts.Title, titel);&lt;br /&gt;
    values.Put(CalendarContract.Events.InterfaceConsts.Dtstart, beginn.ToUnixTimeMilliseconds());&lt;br /&gt;
    values.Put(CalendarContract.Events.InterfaceConsts.Dtend, ende.ToUnixTimeMilliseconds());&lt;br /&gt;
    values.Put(CalendarContract.Events.InterfaceConsts.EventTimezone, TimeZoneInfo.Local.Id);&lt;br /&gt;
&lt;br /&gt;
    var uri = Platform.AppContext.ContentResolver!&lt;br /&gt;
        .Insert(CalendarContract.Events.ContentUri, values);&lt;br /&gt;
    return long.Parse(uri!.LastPathSegment!);      // ID des neuen Termins&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die &amp;lt;code&amp;gt;kalenderId&amp;lt;/code&amp;gt; ermitteln Sie per Abfrage von &amp;lt;code&amp;gt;CalendarContract.Calendars.ContentUri&amp;lt;/code&amp;gt; (z. B. den ersten beschreibbaren Kalender des Google- oder Exchange-Kontos).&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Variante 1 bevorzugen:&amp;#039;&amp;#039;&amp;#039; Weniger Berechtigungen bedeuten weniger Rückfragen in der Google-Play-Prüfung und mehr Vertrauen der Benutzer.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Plattformübergreifend:&amp;#039;&amp;#039;&amp;#039; Für Android &amp;#039;&amp;#039;und&amp;#039;&amp;#039; iOS bietet sich ein Community-Plugin für Kalenderzugriff an (z. B. &amp;#039;&amp;#039;Plugin.Maui.CalendarStore&amp;#039;&amp;#039;); unter iOS ist zusätzlich ein Nutzungshinweis in der &amp;lt;code&amp;gt;Info.plist&amp;lt;/code&amp;gt; nötig.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Zeitzonen:&amp;#039;&amp;#039;&amp;#039; Termine immer als &amp;lt;code&amp;gt;DateTimeOffset&amp;lt;/code&amp;gt; bzw. UTC übergeben, sonst verschieben sie sich bei Sommer-/Winterzeit.&lt;br /&gt;
* Bei Außendienst- und Service-Apps mit Kalender- und Groupware-Anbindung unterstützt Sie die [https://www.max-it.de/development/individuelle-softwareentwicklung/ individuelle Softwareentwicklung von m.a.x. it].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Von Xamarin zu .NET MAUI migrieren]]&lt;br /&gt;
* [[.NET MAUI: Kein Internet im Android-Emulator]]&lt;br /&gt;
&lt;br /&gt;
== Links und Quellen ==&lt;br /&gt;
* [https://learn.microsoft.com/de-de/dotnet/maui/platform-integration/appmodel/permissions Microsoft Learn: Berechtigungen in .NET MAUI]&lt;br /&gt;
* [https://www.max-it.de/development/individuelle-softwareentwicklung/ Individuelle Softwareentwicklung und App-Entwicklung von m.a.x. it]&lt;br /&gt;
&lt;br /&gt;
{{Uebermax}}&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;TechCorner-Redaktion</name></author>
	</entry>
</feed>