android - 获取当天 Android 4.0+ 上的所有日历事件

标签 android calendar google-calendar-api android-4.2-jelly-bean

寻找我的问题的答案已经有一段时间了。 我想要做的:从当天的所有日历中获取所有事件

我能够在 ICS 之前的设备(2.2 到 3.2 Android 版本)上毫无问题地做到这一点。在 Android 4.0+ 上,自从引入新的日历 API 以来,我一直在处理它并取得了相当大的成功。好吧,这就是我在其他设备上进行测试之前的想法。有时我的代码可以工作,有时不会。重复事件不会出现在某些设备或其他设备上,所有事件都会显示(不仅是当天的事件)。

我认为问题出在一行代码上,但我找不到正确的解决方法:

    cursor = contentResolver.query(CalendarContract.Events.CONTENT_URI, COLS, "("+CalendarContract.Events.DTSTART+">"+now+" and "+CalendarContract.Events.DTEND+"<"+endOfDay.getTimeInMillis()+") or (("+CalendarContract.Events.ALL_DAY+"=1) and "+"("+CalendarContract.Events.DTSTART+">="+timeAllDay.getTimeInMillis()+") and "+"("+CalendarContract.Events.DTEND+"<="+endTimeAllDay.getTimeInMillis()+"))", null, null);

这是我用上面一行创建的所有类:

    public class ICSCalendar extends AsyncTask<Intent, String, Intent> 
    {
      private static final String[] COLS = new String[] {CalendarContract.Events.TITLE, CalendarContract.Events.DTSTART, CalendarContract.Events.DTEND, CalendarContract.Events.ALL_DAY};

@Override
protected Intent doInBackground(Intent... params) 
{
    ContentResolver contentResolver = Alert.mContext.getContentResolver();
    Cursor cursor = null;

    try
    {
        long now = new Date().getTime();
        Calendar endOfDay = Calendar.getInstance();
        endOfDay.set(Calendar.HOUR_OF_DAY, 23);
        endOfDay.set(Calendar.MINUTE, 59);
        endOfDay.set(Calendar.SECOND, 59);

        Calendar timeAllDay = Calendar.getInstance();
        timeAllDay.set(Calendar.HOUR_OF_DAY, 0);
        timeAllDay.set(Calendar.MINUTE, 0);
        timeAllDay.set(Calendar.SECOND, 0);

        Calendar endTimeAllDay = Calendar.getInstance();
        endTimeAllDay.add(Calendar.DAY_OF_MONTH, 1);
        endTimeAllDay.set(Calendar.HOUR_OF_DAY, 2);
        endTimeAllDay.set(Calendar.MINUTE, 0);
        endTimeAllDay.set(Calendar.SECOND, 1);

        cursor = contentResolver.query(CalendarContract.Events.CONTENT_URI, COLS, "("+CalendarContract.Events.DTSTART+">"+now+" and "+CalendarContract.Events.DTEND+"<"+endOfDay.getTimeInMillis()+") or (("+CalendarContract.Events.ALL_DAY+"=1) and "+"("+CalendarContract.Events.DTSTART+">="+timeAllDay.getTimeInMillis()+") and "+"("+CalendarContract.Events.DTEND+"<="+endTimeAllDay.getTimeInMillis()+"))", null, null);

        Intent calendarData = new Intent(Alerts.CALENDAR_UI_DATA);
        int nb_events = 0;

        while(cursor.moveToNext()) 
        {
            nb_events++;

            final String title = cursor.getString(0);
            final Date begin = new Date(cursor.getLong(1));
            final Boolean allDay = !cursor.getString(3).equals("0");

            calendarData.putExtra("event_"+nb_events, (String) title);
            calendarData.putExtra("all_day_event_"+nb_events, (Boolean) allDay);

            Calendar beginEvent = Calendar.getInstance();   
            beginEvent.setTimeInMillis(cursor.getLong(1));
            String format = Alerts.get24HourMode(Alert.mContext) ? "kk:mm": "h:mm";
            CharSequence newTime = DateFormat.format(format, beginEvent);
            if(format == "h:mm")
            {
                if((beginEvent.get(Calendar.AM_PM) == 0))
                {
                    newTime = newTime + " A.M";
                }
                else
                {
                    newTime = newTime + " P.M";
                }
            }

            if(!allDay)
            {
                calendarData.putExtra("date_event_"+nb_events, newTime);
            }
            else
            {
                calendarData.putExtra("date_event_"+nb_events, Alert.mContext.getString(R.string.tts_whole_day_calendar_event));
            }
        }

        calendarData.putExtra("nb_events", nb_events);

        return calendarData;
    }
    catch(Exception e)
    {
        Log.d("DEBUG", ""+e);
        return null;
    }
}

@Override
protected void onPostExecute(Intent result) 
{
    // TODO Auto-generated method stub
    super.onPostExecute(result);

    try
    {
        Alert.mContext.sendBroadcast(result);
    }
    catch(NullPointerException e){}
}

@Override
protected void onPreExecute() 
{
    // TODO Auto-generated method stub
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(String... values) 
{
    // TODO Auto-generated method stub
    super.onProgressUpdate(values);
}

任何人都知道如何从 Android 4.0+ 的当天的所有日历中获取所有事件? 感谢大家的帮助:)

最佳答案

为了获得重复发生的事件,您需要实例表,查看更多详细信息 here

我担心这并不像看起来那么容易

关于android - 获取当天 Android 4.0+ 上的所有日历事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13789982/

相关文章:

android - 如何在快速滚动期间禁用滑动刷新?

java - 看不懂android asyncTask

android - 如何迭代 RecyclerView 中的所有 View /项目?

android - SharedElement 在 Activity 转换中崩溃

outlook - 将 ics 文件作为新日历添加到 Outlook 2011 (Mac)

asp.net - 用于 ASP.NET 的良好日期选择器

android - 403 禁止错误将事件添加到 Google 日历

node.js - 如何在 Nodejs 中设置谷歌日历网络钩子(Hook)?

ios - 使用EventKit读取Google日历ical文件

android - 如何获得所选国家的国定假日