Автоматически создавать событие в календаре Android, не спрашивая пользователя?

Я пытаюсь заставить свое приложение автоматически устанавливать событие в Календарь с некоторыми данными, которые я установил.

@SuppressLint({ "NewApi", "ShowToast" })
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Create a new calendar view
    CalendarView calView = (CalendarView) findViewById(R.id.calendar);

    calView.setOnDateChangeListener(new OnDateChangeListener() {
        public void onSelectedDayChange(CalendarView view, int year, int month,
                int dayOfMonth) {
            //Toast.makeText(getApplicationContext(), "" + dayOfMonth, 0).show();

            // Call built in calendar
            Calendar cal = new GregorianCalendar();
            cal.set(year, month, dayOfMonth);  // sets the date picker to the clicked date
            cal.add(Calendar.MONTH, 0); // 0 for current month
            Intent intent = new Intent(Intent.ACTION_INSERT);
            intent.setData(Events.CONTENT_URI);
            intent.putExtra(Events.TITLE, "App Event Test");
            intent.putExtra(Events.EVENT_LOCATION, "At House");
            intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, cal.getTime().getTime()); 
            intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, cal.getTime().getTime() + 3600000); //3600000 for an hour //600000 for 10 minutes
            intent.putExtra(Intent.EXTRA_EMAIL, "[email protected], [email protected]");

            Toast.makeText(getApplicationContext(), month +"-"+ dayOfMonth +"-"+ year, 0).show();

            startActivity(intent);
        }
    });
}
}

Конечно, проблема здесь в том, что он по-прежнему будет предлагать пользователю «Отменить» или «Готово» и установить это событие в своем календаре. Может ли кто-нибудь показать мне ссылку или фрагмент кода о том, как автоматически установить событие?


person Coolai    schedule 16.11.2013    source источник


Ответы (1)


Вам нужно сделать это через CalendarContract. Вот пример, хотя я заметил, что у вас есть дополнительные поля.

{
  ContentResolver cr = getContentResolver();
  ContentValues values = new ContentValues();

  // Add to Android db; duration is null for nonrecurring events.
  values.put (Events.CALENDAR_ID, Long.toString(newCalendarId));
  values.put (Events.DTSTART, dtStart);
  values.put (Events.DTEND, dtEnd);
  values.put (Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
  values.put (Events.TITLE, title);
  Uri uri = cr.insert (Events.CONTENT_URI, values);
}

Предполагая, что у вас есть форма или что-то еще для сбора данных поля, это работает без какого-либо взаимодействия с пользователем, за исключением одного: вам нужно знать идентификатор календаря. (Android позволяет пользователю создавать произвольное количество календарей, которые могут отображаться как переплетенными, так и по отдельности). Чтобы получить список календарей, известных системе, используйте:

String[] projection = new String[] {
  Calendars._ID,                    // 0
  Calendars.NAME,                   // 1
  Calendars.ACCOUNT_NAME,           // 2
  Calendars.CALENDAR_DISPLAY_NAME,  // 3
  Calendars.CALENDAR_ACCESS_LEVEL,  // 4
};

Cursor calCursor = getContentResolver().query(
  Calendars.CONTENT_URI, 
  projection, 
  (Calendars.VISIBLE + " = 1 and " +
   Calendars.CALENDAR_ACCESS_LEVEL + " >= " + Calendars.CAL_ACCESS_CONTRIBUTOR),
  null, 
  Calendars._ID + " ASC");

while (calCursor.moveToNext())
{
  long id = calCursor.getLong(0);
  String name = calCursor.getString(3); // display name
  if (name == null)
    name = calCursor.getString(2); // account name
  if (name == null)
    name = "unknown";

  -- do something with id and name --
} 

Внимание: если вы планируете создавать повторяющиеся мероприятия, будьте осторожны. Нам предстоит многое узнать о RRULE и DURATION.

person Peri Hartman    schedule 16.11.2013