Ответ 1
Я думаю, вы можете проверить событие по beginTime в методе onResume. Там определенно не будет 2 события с тем же beginTime.
Из моего приложения я запускаю календарь с намерением:
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+ как минимум.
Я думаю, вы можете проверить событие по beginTime в методе onResume. Там определенно не будет 2 события с тем же beginTime.
Это то, что я делаю:
Я получаю следующий идентификатор события перед тем, как начинать намерение:
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
}
}
Возможно, вы можете вставить событие программно и отправить намерение "отредактировать" его.
Это может звучать как взлома.. Однако вы можете проверить OnCreate (когда ваше приложение выходит на передний план из приложения календаря), будет ли сохраненное или отмененное событие заблокировано, запросив записи календаря с помощью api-сервера календаря.
Вместо вызова startActivity(intent)
вы можете вызвать startActivityForResult(intent, integer_constant)
и переопределить метод onActivityResult
.
https://developer.android.com/guide/components/activities/activity-lifecycle.html
Похоже, вы хотите использовать startActivityForResult вместо startActivity. Там есть документация для здесь