Как я могу узнать результат моего намерения календаря?

Из моего приложения я запускаю календарь с намерением:

    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", "Some title");
    startActivity(intent);

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

Есть ли что-нибудь релевантное, возвращаемое onActivityResult (...), которое я мог бы использовать в качестве ссылки на событие календаря? Мне нужно это, поэтому я могу позже найти/открыть календарное событие для просмотра/редактирования. [Обновить:] Да, попробовал onActivityResult (...), и намерение возвращается, как только календарь открывается перед любым взаимодействием с пользователем, поэтому это бесполезно.

Я хотел бы сделать это, передав приложение календаря, используя намерение (также, чтобы позволить пользователю выбрать из различных календарей, доступных на устройстве) и избежать воссоздания UE календаря из моего приложения. Также я хотел бы поддержать Android 2.2+ как минимум.

Ответ 1

Я думаю, вы можете проверить событие по beginTime в методе onResume. Там определенно не будет 2 события с тем же beginTime.

Ответ 2

Это то, что я делаю:

Я получаю следующий идентификатор события перед тем, как начинать намерение:

public static long getNewEventId(ContentResolver cr) {      
    Cursor cursor = cr.query(Events.CONTENT_URI, new String [] {"MAX(_id) as max_id"}, null, null, "_id");
    cursor.moveToFirst();
    long max_val = cursor.getLong(cursor.getColumnIndex("max_id"));     
    return max_val+1;
}

Затем я называю намерение, как обычно:

        long event_id = EventUtility.getNewEventId(mContext.getContentResolver());

        Intent intent = new Intent(Intent.ACTION_INSERT)
        .setData(Events.CONTENT_URI)
        .putExtra(Events._ID, event_id)
        .putExtra(Events.TITLE, "title");

        startActivity(intent);

И это трюк в onResume() моей активности. Я проверяю, есть ли новый event_id, созданный так же, как и event_id, сгенерированный ранее. Если они одинаковы, значит, новый календарь создан. Затем я сохраняю новое в своей базе данных.

public static long getLastEventId(ContentResolver cr) {      
    Cursor cursor = cr.query(Events.CONTENT_URI, new String [] {"MAX(_id) as max_id"}, null, null, "_id");
    cursor.moveToFirst();
    long max_val = cursor.getLong(cursor.getColumnIndex("max_id"));     
    return max_val;
}

@Override
public void onResume() {
    super.onResume();

    long prev_id = EventUtility.getLastEventId(getContentResolver());

    // if prev_id == mEventId, means there is new events created
    // and we need to insert new events into local sqlite database.
    if (prev_id == mEventID) {
        // do database insert
    }
}

Ответ 3

Возможно, вы можете вставить событие программно и отправить намерение "отредактировать" его.

Ответ 4

Это может звучать как взлома.. Однако вы можете проверить OnCreate (когда ваше приложение выходит на передний план из приложения календаря), будет ли сохраненное или отмененное событие заблокировано, запросив записи календаря с помощью api-сервера календаря.

Ответ 6

Похоже, вы хотите использовать startActivityForResult вместо startActivity. Там есть документация для здесь