Programmering med Android 4.0 Calendar API: det gode, det dårlige og det stygge

Hvis du har utviklet for Android-operativsystemet en stund, vet du at det har vært plaget med mangel på støtte for plattformens integrerte kalender. Med Android som åpen kildekode har mange smarte utviklere klart å omgå disse manglene, men de gjorde det uten Googles velsignelse og til og med fikk en streng advarsel om at fremtidige utgivelser av Android kan ødelegge apper i markedet som utnyttet uoffisielle API-er.

Med utgivelsen av Android 4.0 (kodenavnet Ice Cream Sandwich) har Google-rammeverkets folk endelig gitt ut en offisiell og støttet mekanisme for samhandling med kjernekalenderappen. Klassen kalles CalendarContract, og med den kan utviklere lese og skrive til de underliggende databasene som holder en liste over kalendere, hendelser, deltakere, påminnelser, osv. Hvis jeg måtte oppsummere det med et ord, ville jeg valgt: kraftig . Hvis jeg måtte oppsummere det med tre ord, ville jeg sagt: det er på tide.

Selv om jeg var fornøyd med at Google endelig kom til å inkludere kalender-API, er dokumentasjonen mye til min skuffelse. Det jeg virkelig håpet å finne, var en prøvekalenderapplikasjon inkludert i Android 4.0 SDK; hvis den er der, har jeg ikke hatt noe hell med å finne det. Til slutt gjorde jeg det jeg gjorde best: skrev litt kode, så den koden sprenge, og pikket deretter på blodbadet til jeg fant ut hva som gikk galt.

Det som følger er en kort introduksjon til klassen CalendarContract; den takler bare lesehendelser, ikke setter inn nye. Hvis dette innlegget garanterer tilstrekkelig interesse, vil en tutorial for å legge til hendelser i kalenderen komme. Kildekoden for dette prosjektet kan lastes ned her. I tillegg til å kreve minst API-nivå 14, vil dette prosjektet ikke fungere ordentlig på emulatoren. Hvorfor? Fordi kalenderen på emulatoren ikke egentlig er funksjonell - noe som betyr at du ikke kan synkronisere den med en Google-konto. Det er en annen måte det nåværende støttenivået til utviklere for å skrive kalenderapper ikke er helt der ennå.

1. Opprett et nytt Android-prosjekt ved å bruke Eclipse. Husk at du må målrette enheter som kjører 4.0 eller høyere for at kalender-APIen skal fungere.

2. For å få tilgang til brukerkalenderen, må du legge til riktige tillatelser til filen AndroidManifest.xml. Siden vi på dette tidspunktet bare leser fra kalenderen, trenger vi bare en enkelt tillatelse:

 "android.permission.READ_CALENDAR" /> 

3. Filen / res / layout for prosjektet vårt vil bestå av en tekstvisning og et par knapper.

 main.xml 

"1.0" encoding = "utf-8" ?>

http://schemas.android.com/apk/res/android

android: layout_width = "fill_parent"

android: layout_height = "fill_parent"

android: orientering = "vertikal" >

android: layout_width = "fill_parent"

android: layout_height = "wrap_content"

android: text = "Introduksjon av ICS-kalender"

android: gravitasjon = "sentrum"

android: polstring = "10dip" />

android: id = "@ + id / data"

android: layout_width = "fill_parent"

android: layout_height = "wrap_content"

android: gravitasjon = "sentrum"

android: polstring = "10dip" />

android: layout_width = "fill_parent"

android: layout_height = "wrap_content"

android: orientering = "horisontal"

android: gravitasjon = "sentrum" >

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: id = "@ + id / forrige"

android: text = "Prev"

android: polstring = "10dip" />

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: id = "@ + id / neste"

android: text = "Neste"

android: polstring = "10dip" />

4. Ved å gå videre til /src/Main.java-filen, starter vi med å utvide Aktivitetsklassen og definere kolonnene vi er interessert i å få fra den underliggende kalenderdatabasen.

 Main.java- pakke com.authorwjf.calsample; 
 import java.text.Format; import android.app.Aktivitet; import android.database. Markør; import android.os.Bundle; import android.provider.CalendarContract; import android.text.format.DateFormat; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; 
 public class Main utvider aktivitetsredskaper OnClickListener { 
 privat markør mCursor = null ; privat statisk finale String  COLS = new String  

{CalendarContract.Events. TITLE, CalendarContract.Events. DTSTART };

}

5. Nå må vi overstyre metoden on on. Vær spesielt oppmerksom på hvordan vi fyller databasemarkøren. Det er her vi trenger vår tidligere definerte COLS-konstant. Du vil også merke deg at etter at databasemarkøren er initialisert og tilbakekalling av klikthåndterer er satt, går vi videre og påkaller manuelt på klikthåndtereren. Denne snarveien lar oss begynne å fylle ut brukergrensesnittet uten å måtte gjenta kode.

 Main.java 

@Overstyring

public void onCreate (Bundle savedInstanceState) { super .onCreate (savedInstanceState);

setContentView (R.layout. main );

mCursor = getContentResolver (). spørring (

CalendarContract.Events. CONTENT_URI, COLS, null, null, null );

mCursor.moveToFirst ();

Knapp b = (Knapp) findViewById (R.id. Neste );

b.setOnClickListener ( dette );

b = (Knapp) findViewById (R.id. forrige );

b.setOnClickListener ( dette );

onClick (findViewById (R.id. forrige ));

}

6. I tilbakeringingen vil vi manipulere markøren til riktig oppføring i databasen og oppdatere brukergrensesnittet.

 @Override offentlig tomrom onClick (Vis v) { 

TextView tv = (TextView) findViewById (R.id. Data );

String title = "N / A";

Lang start = 0L;

switch (v.getId ()) { sak R.id. neste : if (! mCursor.isSiste ()) mCursor.moveToNext (); pause ; sak R.id. forrige : if (! mCursor.isFirst ()) mCursor.moveToPrevious (); pause ;

}

Format df = DateFormat. getDateFormat ( dette ); Format tf = DateFormat. getTimeFormat ( dette ); prøv {

tittel = mCursor.getString (0);

start = mCursor.getLong (1);

} fangst (unntak e) {

//overse

}

tv.setText (tittel + "på" + df.format (start) + "på" + tf.format (start));

}

Det gjør det. Når du laster koden til en faktisk enhet, kan du navigere gjennom alle hendelsene i kalenderen én om gangen.

Figur A

Når du fortsetter å føle deg rundt med API, tror jeg at du vil være enig i at til tross for manglene, er CalendarContact-klassen et velkomment og for lengst forfalt tillegg til programmeringsarsenal.

© Copyright 2021 | pepebotifarra.com