从日历中获取活动

Aka*_*kar 25 android calendar google-calendar-api

我的问题是,我必须制作一个演示应用程序,其中我想阅读Google日历的事件,因为我已经手动插入事件标题,事件时间和整个事件的详细信息.现在我需要从那个日历中读取那些事件.为此,我尝试使用提供日历API类的gcode(谷歌代码)API.但我仍然无法阅读这些事件.

Mar*_*rco 21

上面的代码非常糟糕(它似乎在ICS中不起作用 - 绝对是列名不同)

这里的页面:http: //developer.android.com/guide/topics/providers/calendar-provider.html

提供了更好的概述.一个(更简单)的代码来检索日历:

public class CalendarContentResolver {
    public static final String[] FIELDS = { 
        CalendarContract.Calendars.NAME,
        CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
        CalendarContract.Calendars.CALENDAR_COLOR,
        CalendarContract.Calendars.VISIBLE 
    };

    public static final Uri CALENDAR_URI = Uri.parse("content://com.android.calendar/calendars");

    ContentResolver contentResolver;
    Set<String> calendars = new HashSet<String>();

    public  CalendarContentResolver(Context ctx) {
        contentResolver = ctx.getContentResolver();
    }

    public Set<String> getCalendars() {
        // Fetch a list of all calendars sync'd with the device and their display names
        Cursor cursor = contentResolver.query(CALENDAR_URI, FIELDS, null, null, null);

        try {
            if (cursor.getCount() > 0) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(0);
                    String displayName = cursor.getString(1);
                    // This is actually a better pattern:
                    String color = cursor.getString(cursor.getColumnIndex(CalendarContract.Calendars.CALENDAR_COLOR));
                    Boolean selected = !cursor.getString(3).equals("0");
                    calendars.add(displayName);  
                }
            }
        } catch (AssertionError ex) { /*TODO: log exception and bail*/ }

        return calendars;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 截至今天,`CalendarContract`仅适用于API等级14及以上版本.因此,如果任何人的目标API级别等于或低于Honeycomb系列,则此代码不会有用. (3认同)
  • 是的,你的例子比上面凌乱而又非常强大和实用的例子更简单.您提供的示例只显示可用的日历名称,而不处理(最重要的)事件.它基本上没用,但代码干净. (2认同)
  • 不要忘记 cursor.close() (2认同)

Aka*_*kar 19

好吧,我找到了如何使用谷歌日历应用程序与Android手机集成的整个概念的答案.

码: -

首先你设置这行将从另一个类形式读取日历事件,你的类是当前的ApplicationSettings.java.

ReadCalendar.readCalendar(ApplicationSettings.this);

package com.mycalendarevents.android;

import java.util.Date;
import java.util.HashSet;
import java.util.regex.Pattern;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.text.format.DateUtils;

public class ReadCalendar
{
    static Cursor cursor;

    public static void readCalendar(Context context) {

        ContentResolver contentResolver = context.getContentResolver();

        // Fetch a list of all calendars synced with the device, their display names and whether the

        cursor = contentResolver.query(Uri.parse("content://com.android.calendar/calendars"),
                (new String[] { "_id", "displayName", "selected"}), null, null, null);

        HashSet<String> calendarIds = new HashSet<String>();

        try
        {
            System.out.println("Count="+cursor.getCount());
            if(cursor.getCount() > 0)
            {
                System.out.println("the control is just inside of the cursor.count loop");
                while (cursor.moveToNext()) {

                    String _id = cursor.getString(0);
                    String displayName = cursor.getString(1);
                    Boolean selected = !cursor.getString(2).equals("0");

                    System.out.println("Id: " + _id + " Display Name: " + displayName + " Selected: " + selected);
                    calendarIds.add(_id);
                }
            }
        }
        catch(AssertionError ex)
        {
            ex.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }


        // For each calendar, display all the events from the previous week to the end of next week.        
        for (String id : calendarIds) {
            Uri.Builder builder = Uri.parse("content://com.android.calendar/instances/when").buildUpon();
            //Uri.Builder builder = Uri.parse("content://com.android.calendar/calendars").buildUpon();
            long now = new Date().getTime();

            ContentUris.appendId(builder, now - DateUtils.DAY_IN_MILLIS * 10000);
            ContentUris.appendId(builder, now + DateUtils.DAY_IN_MILLIS * 10000);

            Cursor eventCursor = contentResolver.query(builder.build(),
                    new String[]  { "title", "begin", "end", "allDay"}, "Calendars._id=" + 1,
                    null, "startDay ASC, startMinute ASC");

            System.out.println("eventCursor count="+eventCursor.getCount());
            if(eventCursor.getCount()>0)
            {

                if(eventCursor.moveToFirst())
                {
                    do
                    {
                        Object mbeg_date,beg_date,beg_time,end_date,end_time;

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

                        /*  System.out.println("Title: " + title + " Begin: " + begin + " End: " + end +
                                    " All Day: " + allDay);
                        */
                        System.out.println("Title:"+title);
                        System.out.println("Begin:"+begin);
                        System.out.println("End:"+end);
                        System.out.println("All Day:"+allDay);

                        /* the calendar control metting-begin events Respose  sub-string (starts....hare) */

                        Pattern p = Pattern.compile(" ");
                        String[] items = p.split(begin.toString());
                        String scalendar_metting_beginday,scalendar_metting_beginmonth,scalendar_metting_beginyear,scalendar_metting_begindate,scalendar_metting_begintime,scalendar_metting_begingmt;

                        scalendar_metting_beginday = items[0];
                        scalendar_metting_beginmonth = items[1];
                        scalendar_metting_begindate = items[2];
                        scalendar_metting_begintime = items[3];
                        scalendar_metting_begingmt = items[4];
                        scalendar_metting_beginyear = items[5];


                        String  calendar_metting_beginday = scalendar_metting_beginday;
                        String  calendar_metting_beginmonth = scalendar_metting_beginmonth.toString().trim();

                        int  calendar_metting_begindate = Integer.parseInt(scalendar_metting_begindate.trim());

                        String calendar_metting_begintime = scalendar_metting_begintime.toString().trim();
                        String calendar_metting_begingmt = scalendar_metting_begingmt;
                        int calendar_metting_beginyear = Integer.parseInt(scalendar_metting_beginyear.trim());


                        System.out.println("calendar_metting_beginday="+calendar_metting_beginday);

                        System.out.println("calendar_metting_beginmonth ="+calendar_metting_beginmonth);

                        System.out.println("calendar_metting_begindate ="+calendar_metting_begindate);

                        System.out.println("calendar_metting_begintime="+calendar_metting_begintime);

                        System.out.println("calendar_metting_begingmt ="+calendar_metting_begingmt);

                        System.out.println("calendar_metting_beginyear ="+calendar_metting_beginyear);

                          /* the calendar control metting-begin events Respose  sub-string (starts....ends) */  

                        /* the calendar control metting-end events Respose  sub-string (starts....hare) */

                        Pattern p1 = Pattern.compile(" ");
                        String[] enditems = p.split(end.toString());
                        String scalendar_metting_endday,scalendar_metting_endmonth,scalendar_metting_endyear,scalendar_metting_enddate,scalendar_metting_endtime,scalendar_metting_endgmt;

                        scalendar_metting_endday = enditems[0];
                        scalendar_metting_endmonth = enditems[1];
                        scalendar_metting_enddate = enditems[2];
                        scalendar_metting_endtime = enditems[3];
                        scalendar_metting_endgmt = enditems[4];
                        scalendar_metting_endyear = enditems[5];


                        String  calendar_metting_endday = scalendar_metting_endday;
                        String  calendar_metting_endmonth = scalendar_metting_endmonth.toString().trim();

                        int  calendar_metting_enddate = Integer.parseInt(scalendar_metting_enddate.trim());

                        String calendar_metting_endtime = scalendar_metting_endtime.toString().trim();
                        String calendar_metting_endgmt = scalendar_metting_endgmt;
                        int calendar_metting_endyear = Integer.parseInt(scalendar_metting_endyear.trim());


                        System.out.println("calendar_metting_beginday="+calendar_metting_endday);

                        System.out.println("calendar_metting_beginmonth ="+calendar_metting_endmonth);

                        System.out.println("calendar_metting_begindate ="+calendar_metting_enddate);

                        System.out.println("calendar_metting_begintime="+calendar_metting_endtime);

                        System.out.println("calendar_metting_begingmt ="+calendar_metting_endgmt);

                        System.out.println("calendar_metting_beginyear ="+calendar_metting_endyear);

                          /* the calendar control metting-end events Respose  sub-string (starts....ends) */

                        System.out.println("only date begin of events="+begin.getDate());
                        System.out.println("only begin time of events="+begin.getHours() + ":" +begin.getMinutes() + ":" +begin.getSeconds());


                       System.out.println("only date begin of events="+end.getDate());
                        System.out.println("only begin time of events="+end.getHours() + ":" +end.getMinutes() + ":" +end.getSeconds());

                        beg_date = begin.getDate();
                        mbeg_date = begin.getDate()+"/"+calendar_metting_beginmonth+"/"+calendar_metting_beginyear;
                        beg_time = begin.getHours();

                        System.out.println("the vaule of mbeg_date="+mbeg_date.toString().trim());
                        end_date = end.getDate();
                        end_time = end.getHours();


                        CallHandlerUI.metting_begin_date.add(beg_date.toString());
                        CallHandlerUI.metting_begin_mdate.add(mbeg_date.toString());

                        CallHandlerUI.metting_begin_mtime.add(calendar_metting_begintime.toString());

                        CallHandlerUI.metting_end_date.add(end_date.toString());
                        CallHandlerUI.metting_end_time.add(end_time.toString());
                        CallHandlerUI.metting_end_mtime.add(calendar_metting_endtime.toString());

                    }
                    while(eventCursor.moveToNext());
                }
            }
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是整个代码将被发布,它将简单地从您的日历中读取每个事件,并在2.2及以上版本的回发网址的帮助下:

Uri.parse("content://com.android.calendar/instances/when").buildUpon();
Run Code Online (Sandbox Code Playgroud)

pl在android中找到低于2.2的那些版本,并根据你的需要使用那些事件......


Dem*_*ian 8

我知道这是一个古老的帖子,但是如果有人在不久的将来需要解决方案的话,我找到了优化Akash Takkar给出的答案中找到的解决方案的灵感.

问题


特别是,我在原始代码中发现了一些问题:

  1. 检索日历事件的循环不成熟
    • 因此,仅检索来自第一日历的事件
  2. 使用eventCursor.moveToFirst()跳过每个日历中的第一个事件; 然后直接移动到while循环中的下一个事件
  3. 在eventCursor中未正确设置日历的ID
    • "Calendars._id ="+ 1,应为"Calendars._id ="+ id,
  4. 其他人很难指定自己的时间范围
  5. 当前的解决方案不是面向对象的,这将具有许多优点
  6. 可读性和文档不是最好的

解决方案


我特此创建了一个Github库,它返回指定时间范围内的事件对象列表,可以在以下位置找到:

https://github.com/david-laundav/CalendarService

源文件可以在"CalendarService/src/dk/CalendarService"下找到.

用例

解决方案本身包含两种不同的方法用于不同目的.

第一个用例:

CalendarService.readCalendar(class.this)
// where class.this is either your class or the context
Run Code Online (Sandbox Code Playgroud)

此方法将返回事件列表+/- 1天

第二个用例:

您还可以指定自己的时间范围:

CalendarService.readCalendar(class.this, int days, int hours)
Run Code Online (Sandbox Code Playgroud)

一个例子可能是:

CalendarService.readCalendar(class.this, 2, 5)
Run Code Online (Sandbox Code Playgroud)

这样做将返回+/- 2天和+/- 5小时的事件列表.

该服务已经过测试,但如果您遇到任何问题,请告诉我.


sro*_*mku 5

这篇文章有点旧,但这是另一个简单的解决方案,用于Calendar在Android中获取与内容提供商相关的数据:

使用此库:https://github.com/EverythingMe/easy-content-providers

现在,获取所有日历:

CalendarProvider calendarProvider = new CalendarProvider(context);
List<Calendar> calendars = calendarProvider.getCalendars().getList();
Run Code Online (Sandbox Code Playgroud)

每个日历都包含所有字段,因此您可以获得所需的任何信息: id,name,calendarColor,ownerAccount,accountName,calendarAccessLevel,...

或者,获取特定日历的所有事件:

List<Event> calendars = calendarProvider.getEvents(calendar.id).getList();
Run Code Online (Sandbox Code Playgroud)

还有选项可以获得提醒,参加者,实例.

它适用于列表或光标,并有一个示例应用程序,以查看它的外观和工作方式.事实上,支持所有Android内容提供商,如:联系人,短信,电话,... 所有选项的完整文档:https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers

希望它有帮助:)