5 Stimmen

Wie man die CalendarContract-Klasse in der API-Ebene 8 verwendet

Nach der Veröffentlichung von Android 4 wurde die CalendarContract-Klasse eingeführt, um Ereignisse im Gerätekalender zu schreiben. Aber wenn ich meine App mit API-Level 8 erstellt habe und jetzt diese CalendarContract-Klasse in meinem mit API-Level 8 erstellten Projekt verwenden möchte, weil ich in API-Level 8 eine nicht dokumentierte API verwendet habe, um Ereignisse im Gerätekalender zu schreiben und dieser Code für Android 4 nicht funktioniert. Ist es also möglich, die CalendarContract-Klasse in meinem Projekt zu verwenden, ohne die SDK-Version in der Manifestdatei zu ändern, denn wenn ich die SDK-Version auf 14 ändere, erlaubt sie mir, die CalendarContract-Klasse zu verwenden und damit das Problem für Android 4 zu lösen. Aber wenn ich das tue, läuft meine App nicht in den API-Versionen 8-13, was ich nicht tun möchte, da meine App im Markt live ist. Gibt es also eine mögliche Lösung für dieses Problem? Bitte erkläre mir dies anhand eines Beispiels

3voto

CommonsWare Punkte 950864

Sie können CalendarContract auf Android-Geräten mit einer API-Ebene unter 14 nicht verwenden.

0 Stimmen

Das bedeutet, dass ich mein Problem nicht lösen kann. Warum funktioniert mein vorheriger Code zum Eintragen eines Ereignisses im Gerätekalender nicht für Android 4? Liegt es daran, dass ich eine nicht dokumentierte API verwendet habe? Gibt es einen Weg, das zu lösen?

0 Stimmen

Abstrahiere den Zugriff auf den Kalender und habe unterschiedliche Implementierungen des Kalenderzugriff-Interfaces - eine für das nicht veröffentlichte und unzuverlässige alte Kalender-Interface und eine für CalendarContract?

0 Stimmen

Kannst du es bitte mit einem einfachen Beispiel erklären? Ich habe keine Ahnung davon.

3voto

Andrew S Punkte 2535

Heute ist es mir gelungen, eine Lösung für dieses Problem zu finden, indem ich verschiedene Ratschläge, die ich auf SO und im weiteren Web gefunden habe, zusammengesetzt habe.

Grundsätzlich verwende ich einen Betreuer namens CallendarAccess und zwei Klassen mit der gleichen öffentlichen Methodenstruktur, eine namens CalendarLT14, bei der die Methodenaufrufe auf die alte undokumentierte Methode zurückgreifen, und CalendarGTE14, die die richtige Android V14+-Methode verwendet.

Beide Klassen erweitern eine selbst geschriebene abstrakte Klasse namens CalendarService, die abstrakte Methoden enthält, die gemeinsam sind mit den öffentlichen Methoden von CalendarLT14 und CalendarGTE14.

Ein Problem dabei ist, dass Android-Versionen vor Ice Cream Sandwich (v14) Code wie CalendarContract callendarContact; nicht kompilieren werden, der für spätere Versionen geschrieben wurde. Um dies zu lösen, setzt man in der Manifestdatei die Zielversion auf 14 (Android 4.0), aber die Mindestversion auf 7 (Android 2.1). Das bedeutet, dass der Code 4.0 kompiliert und für frühe Versionen kein Problem darstellt, da er nie aufgerufen wird. Beispiel für die Methode des Betreuers unten.

public CalendarService getInstance()
{
   if (Build.VERSION.SDK_INT >= 14)
           return CalendarGTE14(context)
    else
           return CalendarLT14
}

Diese Lösung bedeutet, dass der Betreuer selektiv ein Objekt zurückgeben kann, das auf den richtigen Code relevant für die verwendete Android-Version zurückgreift und für den Programmierer, der Aufrufe an den Betreuer oder die Klasse CalendarService macht, völlig transparent ist.

0voto

ngesh Punkte 13251

Finden Sie eine Möglichkeit, das API-Level programmgesteuert zu ermitteln... wenn Sie können, können Sie wahrscheinlich geeigneten Code für verschiedene API-Levels verwenden... dies könnte helfen Das Android-API-Level eines Geräts programmgesteuert ermitteln?

0 Stimmen

Das weiß ich, aber was soll ich nach dem Finden des API-Levels tun? Können Sie mir das bitte erklären?

0 Stimmen

Sie erstellen eine Bibliothek, die eine Methode zum Abrufen von Ereignissen enthält.... Nehmen Sie die API-Ebene als Argument und verwenden Sie basierend darauf einen geeigneten Weg, um Ereignisse zu erhalten.

0 Stimmen

Kannst du mir das anhand eines Beispiels zeigen? Ich weiß nicht, wie ich meine eigene Bibliothek erstellen und eine Methode zum Abrufen von Ereignissen hinzufügen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X