2015-02-22 11 views
6

Я пытаюсь добавлять события в календарь со следующим кодом:Добавление событий с напоминания календарь с «Intent.putExtra()» способ сделать

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

А затем запустить действие с: startActivity(mTask.calPopulation());

У меня нет никаких проблем, событие приложения календаря запущено с правильной информацией, которую я ввел в мое приложение, за исключением того, что он не заполняет событие напоминанием, которое я хотел бы добавить.

У вас есть ключи? Я попытался выполнить поиск по многим темам, используя этот метод (я имею в виду aim.putExtra), но никогда не нахожу ничего интересного.

Другой вопрос, есть ли способ сохранить событие + напоминание в календаре без открытия приложения «Календарь» и запроса на действие пользователя?

Заранее спасибо. Alex.

+0

что именно вы хотите? – Apurva

+0

Привет, моя цель - установить напоминания в то же время, когда я добавляю событие в календарь. В моем приведенном примере напоминание не существует в календаре после начала действия. – Alexandre

+0

Удалось ли вам это сделать правильно? По-прежнему использовать 'Intent' и не добавлять его прямо? – Zapnologica

ответ

15

Нет ответа в соответствии с методом, который я указал, но другим способом я нашел, чтобы добавить событие с напоминаниями в календарь.

метода НАСТОЯЩЕГО ДОГОВОРА, работает отлично для меня:

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

Надеется, что это может помочь другим, что столкнулись с той же проблемой я была :).

Alex.

+3

Этот метод добавляет событие непосредственно в календарь, поэтому требует разрешения на чтение и запись календаря. Для нас, кто предпочитает использовать намерение для отправки информации о событии в приложение календаря, есть ли способ преобрести «данные напоминания» на экране создания событий? – Singed

+1

Я непосредственно создал событие календаря через свое приложение и добавил напоминание. Они работают отлично. Но когда я нажимаю напоминание о напоминании, это открытие события календаря устройства. Теперь я хочу настроить уведомление напоминания для загрузки моего приложения, не загружая календарь по умолчанию. Могу ли я достичь этого? –

+0

@Alexandre Что такое CALENDAR_URI_BASE в методах removeEvent & updateEvent? – Newbie

1

Согласен с ответом выше, но важным является идентификатор календаря. вы не можете использовать 1, поскольку телефон Samsung использует 1 для своего календаря (S Planner). Таким образом, идентификатор календаря - это идентификатор, для которого вы хотите отправить электронное письмо. Вы можете получить идентификатор календаря по следующему коду для конкретного события

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 


     }