Как я могу узнать результат моего календарного намерения? - PullRequest
11 голосов
/ 18 марта 2012

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

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 02 марта 2015

Вот что я делаю:

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

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
    }
}
2 голосов
/ 29 марта 2012

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

1 голос
/ 25 марта 2012

Может быть, вы можете вставить событие программно и отправить намерение «отредактировать» его.

0 голосов
/ 28 сентября 2017

Вместо вызова startActivity(intent) вы можете вызвать startActivityForResult(intent, integer_constant) и переопределить onActivityResult метод.

https://developer.android.com/guide/components/activities/activity-lifecycle.html

0 голосов
/ 27 марта 2012

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

0 голосов
/ 25 марта 2012

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

...