Как я могу отличить праздники и Дни рождения от созданных пользователем событий на весь день

#android #android-calendar #android-contentresolver

#Android #android-календарь #android-contentresolver

Вопрос:

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

Я получаю все разные календари, подобные этому:

 cursor = contentResolver.query(Uri.parse("content://com.android.calendar/calendars"),
            (new String[]{Calendars._ID, Calendars.CALENDAR_DISPLAY_NAME, Calendars.CALENDAR_ACCESS_LEVEL}), null, null, null);
  

и события, подобные этому:

 Cursor eventCursor = contentResolver.query(builder.build(),
                new String[]{"title", "begin", "end", "allDay"}, "("   Events.CALENDAR_ID   " = ?)",
                new String[]{String.valueOf(userCalendar.id)}, "startDay ASC, startMinute ASC");
  

Кроме того, может кто-нибудь, пожалуйста, направить меня к списку доступных полей календаря Google и событий?
по какой-то причине я нигде не мог их найти…

Спасибо

Комментарии:

1. если вы решили это, дайте свой ответ здесь

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

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

Ответ №1:

ну, сейчас я просто отфильтровываю в соответствии с уровнем доступа

  if (userCalendar.accessLevel != Calendars.CAL_ACCESS_READ)
  

Ответ №2:

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

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

Если вам нужны только дни рождения, отфильтруйте события, которые содержат «день рождения» в названии события, все остальные события, у которых нет местоположения и в названии которых нет «дня рождения», будут праздниками.

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

Код для получения событий с указанием местоположения,

 public void getDataFromEventTable() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CALENDAR}, 121);
    }
    Cursor cur = null;
    ContentResolver cr = getContentResolver();

    String[] mProjection =
            {
                    "_id",
                    CalendarContract.Events.TITLE,
                    CalendarContract.Events.EVENT_LOCATION,
                    CalendarContract.Events.DTSTART,
                    CalendarContract.Events.DTEND,
            };

    Uri uri = CalendarContract.Events.CONTENT_URI;

    cur = cr.query(uri, mProjection, null, null, null);

    while (cur.moveToNext()) {

        String title = cur.getString(cur.getColumnIndex(CalendarContract.Events.TITLE));
        String loc = cur.getString(cur.getColumnIndex(CalendarContract.Events.EVENT_LOCATION));
        if(loc.length()>0)
            Log.e("event",title " " loc);
    }

}