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