2015-02-22 25 views
6

Sto cercando di aggiungere eventi al calendario con il seguente codice 'Intent.putExtra()':aggiunta di eventi con i ricordi al calendario con il modo di fare

public Intent calPopulation() 
{ 
     Intent calIntent = new Intent(Intent.ACTION_INSERT); 
     calIntent.setType("vnd.android.cursor.item/event"); 
     calIntent.putExtra(CalendarContract.Events.TITLE, this._title); 

     GregorianCalendar calDate = new GregorianCalendar(this._year,this._month, this._day, this._hour, this._minute); 
     calIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, calDate.getTimeInMillis()); 
     calIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, calDate.getTimeInMillis()+60*60*1000); 
     calIntent.putExtra(CalendarContract.Events.HAS_ALARM, true); 
     calIntent.putExtra(CalendarContract.Reminders.EVENT_ID, CalendarContract.Events._ID); 
     calIntent.putExtra(CalendarContract.Events.ALLOWED_REMINDERS, "METHOD_DEFAULT"); 
     calIntent.putExtra(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT); 

     calIntent.putExtra(CalendarContract.Reminders.MINUTES,5); 
     return calIntent; 
} 

e poi lanciare l'azione con: startActivity(mTask.calPopulation());

Non ho alcun problema, l'evento dell'app del calendario è stato avviato con le informazioni corrette che ho inserito nella mia app, tranne per il fatto che non riempie il promemoria che vorrei aggiungere.

Avete qualche indizio? Ho provato a cercare all'interno di molti thread usando questo metodo (intendo l'intent.putExtra) ma non trovo mai nulla di interessante.

Altro punto, c'è un modo per salvare direttamente l'evento + promemoria nel calendario senza aprire l'app del calendario e richiedere l'intervento dell'utente?

Grazie in anticipo. Alex.

+0

che cosa vuoi esattamente? – Apurva

+0

Ciao, il mio obiettivo è impostare i promemoria nello stesso momento in cui aggiungo un evento al calendario. Con il mio esempio, il promemoria non è presente nel calendario dopo l'avvio dell'attività. – Alexandre

+0

Sei riuscito a farlo bene? Mentre stai ancora usando 'Intent' e non lo aggiungi direttamente? – Zapnologica

risposta

15

Nessuna risposta secondo il metodo che ho indicato, ma un altro modo ho trovato per aggiungere eventi con promemoria al calendario.

metodi indicati di seguito hanno lavorando bene per me:

// Add an event to the calendar of the user. 
    public void addEvent(Context context) { 
     GregorianCalendar calDate = new GregorianCalendar(this._year, this._month, this._day, this._hour, this._minute); 

     try { 
      ContentResolver cr = context.getContentResolver(); 
      ContentValues values = new ContentValues(); 
      values.put(CalendarContract.Events.DTSTART, calDate.getTimeInMillis()); 
      values.put(CalendarContract.Events.DTEND, calDate.getTimeInMillis()+60*60*1000); 
      values.put(CalendarContract.Events.TITLE, this._title); 
      values.put(CalendarContract.Events.CALENDAR_ID, 1); 
      values.put(CalendarContract.Events.EVENT_TIMEZONE, Calendar.getInstance() 
        .getTimeZone().getID()); 
      System.out.println(Calendar.getInstance().getTimeZone().getID()); 
      Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values); 

      // Save the eventId into the Task object for possible future delete. 
      this._eventId = Long.parseLong(uri.getLastPathSegment()); 
      // Add a 5 minute, 1 hour and 1 day reminders (3 reminders) 
      setReminder(cr, this._eventId, 5); 
      setReminder(cr, this._eventId, 60); 
      setReminder(cr, this._eventId, 1440); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // routine to add reminders with the event 
    public void setReminder(ContentResolver cr, long eventID, int timeBefore) { 
     try { 
      ContentValues values = new ContentValues(); 
      values.put(CalendarContract.Reminders.MINUTES, timeBefore); 
      values.put(CalendarContract.Reminders.EVENT_ID, eventID); 
      values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT); 
      Uri uri = cr.insert(CalendarContract.Reminders.CONTENT_URI, values); 
      Cursor c = CalendarContract.Reminders.query(cr, eventID, 
        new String[]{CalendarContract.Reminders.MINUTES}); 
      if (c.moveToFirst()) { 
       System.out.println("calendar" 
         + c.getInt(c.getColumnIndex(CalendarContract.Reminders.MINUTES))); 
      } 
      c.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // function to remove an event from the calendar using the eventId stored within the Task object. 
    public void removeEvent(Context context) { 
     ContentResolver cr = context.getContentResolver(); 

     int iNumRowsDeleted = 0; 

     Uri eventsUri = Uri.parse(CALENDAR_URI_BASE+"events"); 
     Uri eventUri = ContentUris.withAppendedId(eventsUri, this._eventId); 
     iNumRowsDeleted = cr.delete(eventUri, null, null); 

     Log.i(DEBUG_TAG, "Deleted " + iNumRowsDeleted + " calendar entry."); 
    } 


    public int updateEvent(Context context) { 
     int iNumRowsUpdated = 0; 
     GregorianCalendar calDate = new GregorianCalendar(this._year, this._month, this._day, this._hour, this._minute); 

     ContentValues event = new ContentValues(); 

     event.put(CalendarContract.Events.TITLE, this._title); 
     event.put("hasAlarm", 1); // 0 for false, 1 for true 
     event.put(CalendarContract.Events.DTSTART, calDate.getTimeInMillis()); 
     event.put(CalendarContract.Events.DTEND, calDate.getTimeInMillis()+60*60*1000); 

     Uri eventsUri = Uri.parse(CALENDAR_URI_BASE+"events"); 
     Uri eventUri = ContentUris.withAppendedId(eventsUri, this._eventId); 

     iNumRowsUpdated = context.getContentResolver().update(eventUri, event, null, 
       null); 

     // TODO put text into strings.xml 
     Log.i(DEBUG_TAG, "Updated " + iNumRowsUpdated + " calendar entry."); 

     return iNumRowsUpdated; 
    } 

Spero che questo potrebbe aiutare gli altri che hanno incontrato lo stesso problema che ho avuto :).

Alex.

+3

Questo metodo aggiunge eventi direttamente al calendario, pertanto richiede autorizzazioni di lettura/scrittura del calendario. Per noi che preferiscono utilizzare l'intento per inviare informazioni sugli eventi all'app del calendario, esiste un modo per prepopolare i dati del "promemoria" nella schermata di creazione dell'evento? – Singed

+1

Ho creato direttamente un evento del calendario tramite la mia app e ho aggiunto anche un promemoria. Stanno funzionando perfettamente. Ma quando faccio clic sulla notifica di promemoria, si apre l'evento del calendario del dispositivo. Ora voglio personalizzare la notifica del promemoria per caricare la mia app senza caricare il calendario predefinito. Posso raggiungere questo? –

+0

@Alexandre Che cos'è CALENDAR_URI_BASE nei metodi removeEvent e updateEvent? – Newbie

1

D'accordo con la risposta sopra ma importante è il calendario Id. non è possibile utilizzare 1 come il telefono Samsung utilizza 1 per il proprio calendario (S Planner). Quindi l'ID del calendario è l'ID per il quale l'e-mail vuoi l'evento. Puoi ottenere l'id del calendario seguendo il codice per un evento specifico

int calenderId=-1; 
     String calenderEmaillAddress="[email protected]"; 
     String[] projection = new String[]{ 
       CalendarContract.Calendars._ID, 
       CalendarContract.Calendars.ACCOUNT_NAME}; 
     ContentResolver cr = activity.getContentResolver(); 
     Cursor cursor = cr.query(Uri.parse("content://com.android.calendar/calendars"), projection, 
       CalendarContract.Calendars.ACCOUNT_NAME + "=? and (" + 
         CalendarContract.Calendars.NAME + "=? or " + 
         CalendarContract.Calendars.CALENDAR_DISPLAY_NAME + "=?)", 
       new String[]{calenderEmaillAddress, calenderEmaillAddress, 
         calenderEmaillAddress}, null); 

     if (cursor.moveToFirst()) { 

      if (cursor.getString(1).equals(calenderEmaillAddress)) 
       calenderId=cursor.getInt(0); //youre calender id to be insered in above answer 


     }