Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Mit Delphi auf Android Handy Kalender auslesen (https://www.delphipraxis.net/195498-mit-delphi-auf-android-handy-kalender-auslesen.html)

sko1 5. Mär 2018 07:58

Mit Delphi auf Android Handy Kalender auslesen
 
Hallo,

nun google ich seit Tagen aber komme nicht weiter:

Mein Ziel ist es, auf einem Handy aus dem (den) Kalender(n) alle Termine auszulesen und mit anderen Terminen meiner App zusammen darzustellen.

Beispiele zum Schreiben von Terminen mit der CalendarEventsManager.pas habe ich gefunden und erfolgreich neue Termine erstellt, aber das ist nicht das Ziel, ich möchte bestehende bereits vorhandene Termine auslesen!

Hätte bitte jemand einen Tip/Link/Beispielsource für mich?

Ciao
Stefan

SebastianZ 5. Mär 2018 08:51

AW: Mit Delphi auf Android Handy Kalender auslesen
 
https://stackoverflow.com/questions/...dar-and-events
http://www.synaptica.info/en/2014/10...event-android/

Versuchs mal mit der JCalendar-Klasse.

Ein alternativer Ansatz, der dann auch für andere OS funktioniert, währe es den Google - Kalender über die Web-API anzusprechen:

https://developers.google.com/google-apps/calendar/

sko1 5. Mär 2018 09:33

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Danke für die Links, welche mich leider nicht weiter bringen:

Die ersten beiden kannte ich bereits, sie schreiben Termine in den Kalender, ich aber möchte alle bestehenden Termine lesen!

Der dritte Link ist, wenn ich das richtig sehe, eine Java-Anwendung, ich möchte mit D2010 Delphi auslesen :-(

Ciao
Stefan

TiGü 5. Mär 2018 10:34

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Zitat:

Zitat von sko1 (Beitrag 1395208)
Danke für die Links, welche mich leider nicht weiter bringen:

Die ersten beiden kannte ich bereits, sie schreiben Termine in den Kalender, ich aber möchte alle bestehenden Termine lesen!

Der dritte Link ist, wenn ich das richtig sehe, eine Java-Anwendung, ich möchte mit D2010 Delphi auslesen :-(

Ciao
Stefan

Google doch mal "query events from android calendar".
Die gefundenen Treffer auf Stack Overflow oder in der offiziellen Doku (https://developer.android.com/guide/...uery-instances) sollten dich eigentlich weiterbringen.
Wenn du Hilfe brauchst, den Java-Quelltext nach Delphi zu portieren, kann man sicherlich bei konkreten Problemen helfen.
Für das erste wäre es wahrscheinlich sinnvoll, wenn du die CalendarEventsManager-Unit studierst und entsprechend erweiterst.

sko1 5. Mär 2018 11:14

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Zitat:

Für das erste wäre es wahrscheinlich sinnvoll, wenn du die CalendarEventsManager-Unit studierst und entsprechend erweiterst.
Studiert habe ich die, aber erweitern?
Genau da liegt doch der Knackpunkt : wie?

Ich habe da noch einen Codeschnipsel gefunden, finde aber nicht heraus wie ich die Werte belegen muss:

Delphi-Quellcode:
Function TForm1.GetCalEvents(DTNow: TDateTime): Boolean;
var
  Cursor: JCursor;
  l_eventUri: Jnet_Uri;
  SortOrder: JString;
  Selection: JString;
  SelectionArgs: TJavaObjectArray<JString>;
  l_projection: TJavaObjectArray<JString>;
  sSQLEventAbfrage: String;
  EventCount: integer;
  EventId: integer;
begin
  Result := False;
  l_eventUri := StrToJURI('content://com.android.calendar/events');
  l_projection := TJavaObjectArray<JString>.Create(8);

   l_projection.Items[0] := StringToJString(TokTitle);
   l_projection.Items[1] := StringToJString(TokDTStart);
   l_projection.Items[2] := StringToJString(TokDTEnd);
   l_projection.Items[3] := StringToJString(TokEventTimeZone);
   l_projection.Items[4] := StringToJString(TokHasAlarm);
   l_projection.Items[5] := StringToJString(TokOriginal_ID);
   l_projection.Items[6] := StringToJString(TokAllDay);
   l_projection.Items[7] := StringToJString(TokID);
  SortOrder := StringToJString('dtstart ASC, dtend ASC');
  // vom ältesten zum neuesten Eintrag
  Selection := nil;
  Selection := StringToJString(sSQLEventAbfrage);
  SelectionArgs := nil; // im Moment nicht genutzt
  // hier die Abfrage der Termine im jeweiligem Zeitraum
  Cursor := TAndroidHelper.Activity.getContentResolver.query(l_eventUri,
    l_projection, Selection, SelectionArgs, SortOrder);
  if not Assigned(Cursor) then
  begin
    // Log('GetCalEvents not Assigned(Cursor)', []);
    Exit;
  end;
  EventCount := Cursor.getCount;
end;
was muss denn da in die projection.Items rein und wie bekomme ich die Termine und nicht nur deren Anzahl?
Irgendwie ist das Ganze für mich noch ein Rätsel...

Ciao
Stefan

TiGü 5. Mär 2018 12:11

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Delphi-Quellcode:
Function TForm1.GetCalEvents(DTNow: TDateTime): Boolean;
var
  Cursor: JCursor;
  l_eventUri: Jnet_Uri;
  SortOrder: JString;
  Selection: JString;
  SelectionArgs: TJavaObjectArray<JString>;
  l_projection: TJavaObjectArray<JString>;
  sSQLEventAbfrage, title: String;
  EventCount: integer;
  EventId: integer;
begin
  Result := False;
  l_eventUri := StrToJURI('content://com.android.calendar/events');
  l_projection := TJavaObjectArray<JString>.Create(8);

   l_projection.Items[0] := StringToJString(TokTitle);
   l_projection.Items[1] := StringToJString(TokDTStart);
   l_projection.Items[2] := StringToJString(TokDTEnd);
   l_projection.Items[3] := StringToJString(TokEventTimeZone);
   l_projection.Items[4] := StringToJString(TokHasAlarm);
   l_projection.Items[5] := StringToJString(TokOriginal_ID);
   l_projection.Items[6] := StringToJString(TokAllDay);
   l_projection.Items[7] := StringToJString(TokID);
  SortOrder := StringToJString('dtstart ASC, dtend ASC');
  // vom ältesten zum neuesten Eintrag
  Selection := nil;
  Selection := StringToJString(sSQLEventAbfrage);
  SelectionArgs := nil; // im Moment nicht genutzt
  // hier die Abfrage der Termine im jeweiligem Zeitraum
  Cursor := TAndroidHelper.Activity.getContentResolver.query(l_eventUri,
    l_projection, Selection, SelectionArgs, SortOrder);
  if not Assigned(Cursor) then
  begin
    // Log('GetCalEvents not Assigned(Cursor)', []);
    Exit;
  end else
  begin
    while Cursor.moveToNext do
    begin
      title := Cursor.getString(0);
      // usw. usf.
      EventId := Cursor.getLong(7);
    end;
  end;
  EventCount := Cursor.getCount;
  Result := EventCount > 0;
end;
Einfach das Beispiel aus meinen Link in Delphi umsetzen, ist nicht so schwer.

SebastianZ 5. Mär 2018 12:28

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Zitat:

Zitat von sko1 (Beitrag 1395208)
...

Der dritte Link ist, wenn ich das richtig sehe, eine Java-Anwendung, ich möchte mit D2010 Delphi auslesen :-(

...

Stimmt so nicht, es ist auf dieser Seite die Web-API zu finden, und ein Webinterface ist nicht sprachenspezifisch. Es gibt nur keine Beispiele in Delphi auf deren Seite, aber es lässt sich auf alle Fälle mit Indy anbinden.

sko1 5. Mär 2018 12:42

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Delphi-Quellcode:
  l_projection.Items[0] := StringToJString(TokTitle);
   l_projection.Items[1] := StringToJString(TokDTStart);
   l_projection.Items[2] := StringToJString(TokDTEnd);
   l_projection.Items[3] := StringToJString(TokEventTimeZone);
   l_projection.Items[4] := StringToJString(TokHasAlarm);
und da beginnen meine Probleme : TokTitle, TokDTStart, ... sind meinem Delphi unbekannt!
Wenn ich das richtig verstehe sind das die Spaltennamen, finde aber keine Auflistung was da verwendet wird!

Ciao
Stefan

TiGü 5. Mär 2018 13:16

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Zitat:

Zitat von sko1 (Beitrag 1395241)
und da beginnen meine Probleme : TokTitle, TokDTStart, ... sind meinem Delphi unbekannt!
Wenn ich das richtig verstehe sind das die Spaltennamen, finde aber keine Auflistung was da verwendet wird!

Ich muss leider plakativ fragen:
Die offizielle Android-Dokumentation ist dir bekannt und du weißt, wie man innerhalb einer Dokumentation navigiert und sucht?

sko1 5. Mär 2018 13:37

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Muss ich plakativ antworten : welche Dokumentation meinst Du?

Ich habe die letzten Tage hunderte Seiten im Netz angesehen und übersehe vielleicht inzwischen auch vieles, so z.B. habe ich "DURATION" als Spaltenmöglichkeit gefunden was mir eine "Invalid Column" Exception beschert, da findet sich "_id" wie auch "_ID" aber z.B. "dtstart" bringt nur den Tag und nicht die Uhrzeit dazu, es wäre sehr hilfreich wenn Du mir den Dir bekannten Link zu einer passenden Dokumentation schreiben könntest!
Was ich auch nicht herausfinden konnte ob bei diese Spaltennamen auch Groß/Kleinschreibung relevant ist.

Danke
Ciao
Stefan

TiGü 5. Mär 2018 13:39

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Was hältst du denn von dem Link aus Beitrag Nummer vier?

sko1 5. Mär 2018 14:31

AW: Mit Delphi auf Android Handy Kalender auslesen
 
den habe ich gesehen, bringt mich aber in der Frage nicht weiter!
Denn da findet sich beim Calendar.Event auch das oben genannte "DURATION" was mir einen Laufzeitfehler beschert...

Ich benötige eine Liste der verwendbaren Spaltennamen, findet sich diese auch im verlinkten Dokument?

Was mir inzwischen auch noch aufgefallen ist: mit der Kalenderabfrage bekomme ich alles (auch Wochennummern, Feiertage etc.) die ich im Handy von der Anzeige ausgeschlossen habe.

Muss ich die (und wenn ja wie) auch noch selbst wegfiltern?

Ciao
Stefan

TiGü 5. Mär 2018 14:42

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Zitat:

Zitat von sko1 (Beitrag 1395262)
den habe ich gesehen, bringt mich aber in der Frage nicht weiter!
Denn da findet sich beim Calendar.Event auch das oben genannte "DURATION" was mir einen Laufzeitfehler beschert...

Ich benötige eine Liste der verwendbaren Spaltennamen, findet sich diese auch im verlinkten Dokument?

Ja, wenn man ein bisschen liest und versteht.
Mein Link aus Beitrag Nummer vier (zur Wiederholung: https://developer.android.com/guide/...uery-instances) springt zu der Überschrift "Querying the Instances table" mit Begleittext und Java-Beispiel. Wenn man jetzt im Begleittext auf den Blau hinterlegten Text (ja, das ist ein Link) "CalendarContract.EventsColumns" klickt, dann kommt man auf diese Seite: https://developer.android.com/refere...tsColumns.html

In der Tabelle findet man "Duration", da klickt man drauf.
Dann scrollt die Website auf magische Weise nach unten und wir sehen:

Zitat:

DURATION
added in API level 14
String DURATION
The duration of the event in RFC2445 format. Column name.

Type: TEXT (duration in RFC2445 format)

Constant Value: "duration"

Schlussfolgerung:
Delphi-Quellcode:
StringToJString('duration');
wird wohl das gesuchte sein.

zeras 5. Mär 2018 19:00

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Du kannst für die Beispiele folgende Konstanten nehmen:

Delphi-Quellcode:
 TokTitle = 'title';
  TokDTStart = 'dtstart';
  TokDTENd  = 'dtend';
  TokEventTimeZone = 'eventTimezone';
  TokHasAlarm = 'hasAlarm';
Und aus den Beispielen oben nimmst du erst einmal weniger Spalten:

Delphi-Quellcode:
 l_projection := TJavaObjectArray<JString>.Create(8); <- das bedeutet, dass du 8 Spalten zurück erwartest. Nimm einfach weniger, wie hier weiter unten und dann schreibst du beispielsweise nur 5 in das .Create(5)

   l_projection.Items[0] := StringToJString(TokTitle);
   l_projection.Items[1] := StringToJString(TokDTStart);
   l_projection.Items[2] := StringToJString(TokDTEnd);
   l_projection.Items[3] := StringToJString(TokEventTimeZone);
   l_projection.Items[4] := StringToJString(TokHasAlarm);

sko1 6. Mär 2018 08:57

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Vielen Dank für die Unterstützung!

Bis jetzt scheinen alle meine Fragen beantwortet zu sein, ich habe erkannt dass die Schreibweise der Spaltennamen relevant ist und dass es einen Unterschied macht ob man auf 'content://com.android.calendar/events' oder 'content://com.android.calendar/calendars' zugreift, was unterschiedliche Tabellen mit unterschiedlichen verfügbaren Spalten beinhaltet.

So muss man erst mal calendars auslesen um mit deren ID und Name die Kalender-ID aus der Events-Tabelle "übersetzen zu können".

Was mir vorher auch nicht klar war, dass es unterschiedliche Kalender für "Wochennummern", "Geburtstage", ect. sind...

Wenn man damit das erste mal zu tun hat ist das schwer durchschaubar, ich denke aber danke Eurer Hilfe blicke ich da jetzt durch :-)))

Ciao
Stefan

Hobby-Programmierer 6. Mär 2018 10:52

AW: Mit Delphi auf Android Handy Kalender auslesen
 
Vielleicht wäre es ja möglich ein minimales Projekt hier zu posten, ich würde mir das auch gerne einmal anschauen.

Vielen Dank ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz