2015-02-22 4 views
6

Ich versuche Ereignisse zum Kalender hinzuzufügen, mit dem folgenden Code zum Kalender:Hinzufügen von Ereignisse mit Erinnerungen mit ‚Intent.putExtra()‘ Art und Weise zu tun

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; 
} 

Und dann starten Sie die Aktion mit: startActivity(mTask.calPopulation());

Ich habe kein Problem, das Kalender-App-Ereignis mit den richtigen Informationen gestartet, die ich in meine App eingegeben, außer dass es das Ereignis nicht die Erinnerung, die ich hinzufügen möchte, ausfüllen.

Haben Sie irgendwelche Hinweise? Ich habe versucht, in vielen Threads mit dieser Methode zu suchen (ich meine die intent.putExtra), aber finde nie etwas Interessantes.

Anderer Punkt, gibt es eine Möglichkeit, das Ereignis + Erinnerung in den Kalender direkt zu speichern, ohne die Kalender App zu öffnen und Benutzeraktion anzufordern?

Vielen Dank im Voraus. Alex.

+0

was genau möchten Sie? – Apurva

+0

Hallo, mein Ziel ist es, Erinnerungen in der gleichen Zeit zu setzen, die ich ein Ereignis zum Kalender hinzufüge. Bei meinem Beispiel ist die Erinnerung nach dem Start der Aktivität nicht im Kalender vorhanden. – Alexandre

+0

Hast du es richtig gemacht? Während "Intent" immer noch verwendet wird und nicht direkt hinzugefügt wird? – Zapnologica

Antwort

15

Keine Antwort nach der Methode, die ich darauf hingewiesen habe, aber eine andere Möglichkeit, Ereignis mit Erinnerungen an den Kalender hinzuzufügen.

Nachfolgend Methoden arbeiten gut für mich:

// 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; 
    } 

Hope this anderen helfen könnte, die das gleiche Problem begegnete ich :) hatte.

Alex.

+3

Diese Methode fügt das Ereignis direkt in den Kalender ein und erfordert daher Lese-/Schreibberechtigungen für Kalender. Für uns, die lieber Absicht verwenden, um Ereignisinformationen an die Kalender-App zu senden, gibt es eine Möglichkeit, die "Erinnerungs" -Daten auf dem Ereigniserstellungsbildschirm vorzufüllen? – Singed

+1

Ich habe direkt über meine App ein Kalenderereignis erstellt und eine Erinnerung hinzugefügt. Sie arbeiten perfekt. Wenn ich jedoch auf die Erinnerungsbenachrichtigung klicke, wird das Gerätekalenderereignis geöffnet. Jetzt möchte ich die Erinnerungsbenachrichtigung anpassen, um meine App zu laden, ohne den Standardkalender zu laden. Kann ich das erreichen? –

+0

@Alexandre Was ist CALENDAR_URI_BASE in removeEvent & updateEvent-Methoden? – Newbie

1

Stimmen Sie mit der obigen Antwort überein, aber wichtig ist die Kalender-ID. Sie können 1 nicht verwenden, da das Samsung-Telefon 1 für ihren Kalender verwendet (S Planner). Die Kalender-ID ist also die ID, für die Sie das Ereignis wünschen. Sie können die Kalender-ID erhalten, indem Sie den Code für ein bestimmtes Ereignis eingeben.

Verwandte Themen