Календар на Android, вземете идентификатор на събитие

пиша приложение, което трябва да добави някои събития към календар в android. За вмъкване току-що използвах следния код:

public void onItemClick(AdapterView<?> adapter, View curview, int position, long id) {
    WhoisEntry entry = this.adapter.getItem(position);      
    String domainName = entry.getDomainName();
    Date expDate = entry.expirationDate;
    Toast.makeText(getApplicationContext(), "Domain: " + domainName, Toast.LENGTH_SHORT).show();
    Calendar cal = Calendar.getInstance();            
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setType("vnd.android.cursor.item/event");
    intent.putExtra("beginTime", entry.expirationDate);
    intent.putExtra("allDay", false);       
    intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
    intent.putExtra("title", "Expiration of " + entry.domainName);
    startActivity(intent);
}

Сега се чудя дали е възможно да получа идентификатор, свързан с това събитие, по този начин, след като дадено събитие е вмъкнато и неговият идентификатор е записан в моето приложение, потребителят може да извика това събитие директно от приложението. Възможно ли е?


person Ivan    schedule 28.02.2012    source източник
comment
Сигурни ли сте, че искате да зададете крайния час на текущия час?   -  person toto2    schedule 28.02.2012
comment
опс :D ноно! Просто моето разсейване :D   -  person Ivan    schedule 28.02.2012
comment
Ако разработвате за ICS, има нов API за календари; вижте този блог.   -  person toto2    schedule 28.02.2012
comment
да, знам, но искам да разработя приложението си не само за ICS.   -  person Ivan    schedule 28.02.2012


Отговори (2)


Извлякох списък с колони, използвани за съхраняване на събития в календара на Android. Ето списъка:

[0] "originalEvent" (id=830007842672)
[1] "availabilityStatus" (id=830007842752)
[2] "ownerAccount" (id=830007842840)
[3] "_sync_account_type" (id =830007842920)
[4] "видимост" (id=830007843008)
[5] "rrule" (id=830007843080)
[6] "последна дата" (id=830007843144)
[7 ] "hasAlarm" (id=830007843216)
[8] "guestsCanModify" (id=830007843288) [9] "guestsCanSeeGuests" (id=830007843376)
[10] "exrule" (id=830007843464)
[11] "rdate" (id=830007843528)
[12] "transparency" (id=830007843592)
[13] "timezone" (id=830007843672)
[14] "selected" ( id=830007843744)
[15] "dtstart" (id=830007843816) [16] "title" (id=830007843888)
[17] "_sync_time" (id=830007843952)
[18] " _id" (id=830007844024) [19] "hasAttendeeData" (id=830007844088) [20] "_sync_id" (id=830007844176)
[21] "commentsUri" (id=830007844248) [22] "описание" ( id=830007844328) [23] "htmlUri" (id=830007844408) [24] "_sync_account" (id=830007844480)
[25] "_sync_version" (id=830007844560)
[26] "hasExtendedProperties" ( id=830007844640)
[27] "calendar_id" (id=830007844736)

След това, ако искам да получа новия идентификатор на събитието за моето събитие:

public static long getNewEventId(ContentResolver cr, Uri cal_uri){      
    Uri local_uri = cal_uri;
    if(cal_uri == null){
        local_uri = Uri.parse(calendar_uri+"events");
    } 
    Cursor cursor = cr.query(local_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;
}

И за събитие за вмъкване:

public void insertDomainEntry(Date exp_date, String name, long event_id){
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("exp_date", exp_date.getTime()/1000);
    values.put("event_id", event_id);
    values.put("domainname", name);
    db.insertOrThrow("domains_events", null, values);
}

Това решение изглежда работи, дори ако това вероятно не е много добро решение.

РЕДАКТИРАНЕ 02/2015 Целта на getNextEventId е да създаде нов запис за събитие за таблицата със събития, тук е кодът с използването на този метод:

@Override
    public void onItemClick(AdapterView<?> adapter, View curview, int position,
            long id) {
        WhoisEntry entry = this.adapter.getItem(position);      
        long event_id = CalendarUtils.getNewEventId(getContentResolver(), null);

        Toast.makeText(getApplicationContext(), "Domain: " + entry.getDomainName(),
                Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(Intent.ACTION_EDIT);
        intent.setType("vnd.android.cursor.item/event");
        intent.putExtra("beginTime", entry.getExpiration().getTime());
        intent.putExtra("_id", event_id);
        intent.putExtra("allDay", false);       
        intent.putExtra("endTime", entry.getExpiration().getTime()+60*30);
        intent.putExtra("title", "Expiration of " + entry.getDomainName());
        startActivity(intent);

        database.insertDomainEntry(entry.getExpiration(),
                entry.getDomainName(), event_id);
    }

Актуализация 09/2015

Както е поискано в коментара, добавям как да получа URI на календара (това е основно мястото, където се съхранява календарът и приложението се опитва да го отгатне, като търси във всички известни възможни пътища на календара)

public static String getCalendarUriBase(Activity act) {     
    String calendarUriBase = null;
    Uri calendars = Uri.parse("content://calendar/calendars");
    Cursor managedCursor = null;

    try {
        managedCursor = act.getContentResolver().query(calendars,
                null, null, null, null);
    } catch (Exception e) {
    }

    if (managedCursor != null) {
        calendarUriBase = "content://calendar/";
    } else {
        calendars = Uri.parse("content://com.android.calendar/calendars");
        try {
            managedCursor = act.getContentResolver().query(calendars,
                    null, null, null, null);
        } catch (Exception e) {
        }
        if (managedCursor != null) {
            calendarUriBase = "content://com.android.calendar/";
        }
    }

    calendar_uri= calendarUriBase;
    return calendarUriBase;
}
person Ivan    schedule 17.03.2012
comment
откъде знаеш, че последното събитие е това, което твоят потребител е добавил? може би е по-старо събитие? (потребителят анулира) - person dowi; 19.02.2015
comment
Защо трябва да знам за последното събитие? Когато вмъквам ново събитие, просто трябва да знам за id записа в календара, който току-що създадох, и когато създавам елемент, аз също имам неговия идентификатор. И ако трябва да ги актуализирате в друг момент, вероятно е по-добре да запазите препратки към елемента от календара/събитието в приложението (използвайки sqlite или нещо подобно). - person Ivan; 19.02.2015
comment
получавате MAX(id), така че предполагам, че получавате последното събитие, което е добавено към календара. но как да разберете, че потребителят не е отменил дейността в календара, която сте отворили с startActivity(intent)? - person dowi; 19.02.2015
comment
Добре, известно време не работех с тези неща и почти забравих какво направих. Ще актуализирам отговора си с другото парче код, което обяснява значението на getNextEventId, но накратко използвам getNextEventId, за да създам записа за събитие в таблицата със събития, но не и истинския запис в календара, той ще бъде създаден от намерението на календара, не помня защо го направих :D - person Ivan; 19.02.2015
comment
Бъдете внимателни, като използвате getNewEventId(max_val+1).. помислете дали потребителят е изтрил последното събитие.. добавянето на ново събитие с използван идентификатор може да доведе до неочакван резултат, ако има x-записи, свързани с този идентификатор, т.е. остатък или участник. - person Maher Abuthraa; 07.06.2016
comment
@SagarNayak, за съжаление не, може би можете да проверите дали са променили отново URI на календара? може би е под различен URI? - person Ivan; 19.02.2020

Можете лесно да получите идентификатор на събитие, след като вмъкнете събитие.

long calID = 3;
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
...

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);

// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());
//
// ... do something with event ID
//
//
person Gary Chen    schedule 21.05.2020