2011-12-31 17 views
7

Ho problemi a trovare una soluzione al mio problema. Sto cercando di aggiungere più eventi nel mio calendario Android, ma non so come. Mi ha dato trovato questo codice:Inserire più eventi nel calendario Android

 Calendar cal = Calendar.getInstance();    
      Intent intent = new Intent(Intent.ACTION_EDIT); 
      intent.setType("vnd.android.cursor.item/event"); 
      intent.putExtra("beginTime", cal.getTimeInMillis()); 
      intent.putExtra("allDay", true); 
      intent.putExtra("rrule", "FREQ=YEARLY"); 
      intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000); 
      intent.putExtra("title", "A Test Event from android app"+String.valueOf(i)); 
      startActivity(intent); 

ma non fa altro che mandarmi al mio calendario e mi permette di modificare e inserisco il mio evento manualmente. Voglio inserire automaticamente gli eventi, senza andare alla mia app di calendario. Inoltre, posso aggiungere solo un evento usando questo codice. Questo non è quello che volevo. Ho 2 matrici di stringhe, una contenente la data e una contenente il nome dell'evento. Qualcuno sa se c'è un modo per farlo? Sono stato alla ricerca di una soluzione per un po 'e non ne avevo trovato uno. Sarei grato se qualcuno mi aiutasse. Grazie!

Ho risolto il problema! Grazie mille! Ma ora ho un altro problema che non posso risolvere. ho questo codice:

 ContentValues cv = new ContentValues(); 
     cv.put("calendar_id", calIds[0]); 
     cv.put("title", title); 
     //cv.put("dtstart", dtstart); 
     //cv.put("dtend", dtend); 
     cv.put("rrule", "FREQ=MONTHLY"); 
     cv.put("description", comment); 
     Calendar start = Calendar.getInstance(); 
     start.set(2012, 0, 2, 8, 0, 0); 

     Calendar end = Calendar.getInstance(); 
     end.set(2012, 0, 2, 9, 0, 0); 

     long startTime = start.getTimeInMillis();  
     long endTime = end.getTimeInMillis(); 

     cv.put("dtstart", startTime); 
     cv.put("dtend", endTime); 
     //Insertion on the events of the calendar 
     cr.insert(Uri.parse("content://com.android.calendar/events"), cv); 

Inserisce il mio evento, ma non lo fa ricorrenti. Voglio dire che il mio evento appare su 2jan2012 ma su 2jan2013 non lo fa e nemmeno nel 2014 e così via. Così ho aperto il mio calendario sul telefono e ho provato a modificare il mio evento e ho visto che dovevo selezionare l'occorrenza di esso, lì mostra il 2 gennaio 2012 non il 2 gennaio come dovrebbe se fosse per personalizzare il mio evento dal mio Telefono. D'altra parte, se provo ad aggiungere manualmente un evento dal mio telefono funziona perfettamente (voglio dire, posso aggiungere un evento che si verifica ogni anno).

risposta

5

android SDK non espone alcuna interfaccia per manipolare il calendario, ma è possibile trovarlo dal codice sorgente Android. Android memorizza il calendario in un database sqlite interno, sebbene sia protetto dall'accesso diretto ma è comunque possibile aggiungere/eliminare/aggiornare/eseguire query sui dati del calendario tramite ContentResolver. Un pezzo di codice per inserire un evento potrebbe essere simile a questo:

public String addEvent(String calendarId, String title, long startTime, 
     long endTime, int allDay) { 
    ContentValues event = new ContentValues(); 
    event.put("calendar_id", calendarId); // "" for insert 
    event.put("title", title); 
    event.put("description", ""); 
    event.put("eventLocation", ""); 
    event.put("allDay", allDay); 
    event.put("eventStatus", 1); 
    event.put("transparency", 0); 
    event.put("dtstart", startTime); 
    event.put("dtend", endTime); 

    ContentResolver contentResolver = this.context.getContentResolver(); 
    Uri eventsUri = Uri.parse("content://com.android.calendar/calendars"); 
    Uri url = contentResolver.insert(eventsUri, event); 
    String ret = url.toString(); 
    return ret; 
} 

Quando si inserisce un evento con successo, una serie rappresentano URI della manifestazione viene restituito da ContentResolver.insert, è possibile interrogare, aggiornare o cancellare in un secondo momento . Nei precedenti SDK precedenti all'SDK 8, il contenuto uri del calendario è "content: // calendar/calendars" che differisce dagli SDks 8 e successivi.
Nel frattempo, fai attenzione con quelle rom personalizzate. poiché l'API del calendario non è presente nei documenti dell'SDK, il fornitore del calendario potrebbe essere modificato o addirittura rimosso da alcuni fornitori e operatori, quindi potrebbe essere necessario testare l'applicazione su molti dispositivi.
Buona fortuna!

+0

In realtà essi finalmente aggiunto un calendario API ufficiali in ICS: http://developer.android.com/reference/android/provider/CalendarContract.html –

+0

grazie @mbaird, è davvero una buona notizia! Non sto lavorando su Android per un po 'e dovrei recuperare l'ultima versione. – hago

+0

Ho risolto il problema ma ora ho un altro problema. Se potessi aiutarmi ancora una volta, sarei molto grato ... Ho modificato la mia domanda sull'altro problema. – Lara

0
public Uri createEvent(int calId, ICalEvent event) { 
     ContentValues eventValues = new ContentValues(); 

     eventValues.put("calendar_id", calId); 
     eventValues.put("title", event.getSummary()); 
     eventValues.put("description", event.getDescription()); 
     eventValues.put("eventLocation", event.getLocation()); 

// eventValues.put("UID", "ADE52556e6976657273697465323031302f323031312d323637392d302d3131"); 
// originalEvent 
     eventValues.put("originalEvent", event.getUid() + ";" + event.getLastModif().getTime()); 

     long startTime = event.getStart().getTime();//System.currentTimeMillis() + 1000 * 60 * 60; 
     long endTime = event.getEnd().getTime();//System.currentTimeMillis() + 1000 * 60 * 60 * 2; 

     eventValues.put("dtstart", (event.isWholeDayEvent() ? endTime : startTime)); 
     eventValues.put("dtend", endTime); 

     eventValues.put("allDay", (event.isWholeDayEvent() ? 1 : 0)); // 0 for false, 1 for true 
     eventValues.put("eventStatus", 1); 
     eventValues.put("visibility", 0); 
     eventValues.put("transparency", 0); 
     eventValues.put("hasAlarm", 0); // 0 for false, 1 for true 

     System.out.println("USING SYNC ACCOUNT " + sync_account); 

     eventValues.put("_sync_account_type", sync_account); 

     Uri eventsUri = Uri.parse(getCalendarUriBase()+"events"); 

     Uri insertedUri = activity.getContentResolver().insert(eventsUri, eventValues); 
     return insertedUri; 
    } 
Problemi correlati