65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 C# 中读取 Google 日历

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (37投票s)

2010年3月11日

CPOL

3分钟阅读

viewsIcon

202239

downloadIcon

9545

本文将介绍如何在 C# 中使用 Google 日历。

引言

本文介绍了如何使用 Google 数据 API 通过 C# 读取您的 Google 日历。它将允许开发人员编写与 Google 服务交互的应用程序,这些服务将具有日历、Google 文档和联系人等多种服务。

通过使用 API 可以进行日历的同步、导入和导出。通过使用 Google 日历服务,您可以创建新事件、编辑或删除现有事件以及查询符合特定条件的事件。

注意:本文仅描述了 Google 日历服务。但以同样的方式,您将能够使用 Google 提供的其他服务。请获取源代码以获取更多信息。

Calendar.jpg

如何使用 Google 数据 API

您必须从以下链接下载 Google 数据 API,并安装在您的机器上

Google 数据 API 链接:http://code.google.com/p/google-gdata/downloads/detail?name=Google%20Data%20API%20Setup%281.4.0.2%29.msi&can=2&q=

以下是使用 Google 日历服务的参考

  1. Google.GData.AccessControl
  2. Google.GData.Client
  3. Google.GData.Extensions

需要以下三个命名空间。

  • Google.GData.Calendar 命名空间具有查看和更新日历事件的功能。
  • Google.GData.Extensions 命名空间包含常见的扩展元素。
  • Google.GData.Client 命名空间包含服务实现。
using Google.GData.Calendar;
using Google.GData.Extensions;
using Google.GData.Client;

背景

由于 Google 应用程序越来越受欢迎,我决定写一篇关于 Google 应用程序的文章,这对许多人来说会很有用。

示例应用程序包含六个项目

Projects.JPG

Google 帮助程序项目

此项目有一个 Google 日历的帮助程序类,它具有 GetServiceGetAllEvents AddEvents 方法。

CalendarHelper 类有三个用于从 Google 应用程序获取服务的属性。ApplicationName 可以是任何东西,比如 "AAA"。UserName 是您的 GMail 用户 ID,Password 是您的 GMail 密码。

public class CalendarHelper
{
    public string ApplicationName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }  
} 
  • GetService 方法将由 Google 日历数据 API 访问,并返回服务对象
    public class CalendarHelper
    {
        public static CalendarService GetService(string applicationName, 
    				string userName, string password)
        {
            CalendarService service = new CalendarService(applicationName);
            service.setUserCredentials(userName, password);
            return service;
        }  
    } 
  • GetAllEvents 方法使用查询对象从 Google 日历读取日历数据。这将需要两个参数。CalendarService 是您在上一步中创建的服务对象。startDate 是您需要从 Google 日历查询的实际查询。EventQuery 对象保存查询。
    public static IEnumerable<EventEntry> GetAllEvents
    		(CalendarService service, DateTime? startData)
    {
          // Create the query object:
          EventQuery query = new EventQuery();
          query.Uri = new Uri("http://www.google.com/calendar/feeds/" + 
    			service.Credentials.Username + "/private/full");
          if (startData != null)
              query.StartTime = startData.Value;
    
          // Tell the service to query:
          EventFeed calFeed = service.Query(query);
          return calFeed.Entries.Cast<EventEntry>();
    } 
  • AddEvent 方法将新日历数据添加到 Google 日历中。必须提供事件标题内容位置开始时间结束时间
    • 事件标题是您的新日历标题
    • 内容是描述
    • 位置是事件位置
    • 开始时间是您计划开始事件的时间
    • 结束时间是您计划结束事件的时间
    public static void AddEvent(CalendarService service, string title, 
    	string contents, string location, DateTime startTime, DateTime endTime)
    {
        EventEntry entry = new EventEntry();
    
        // Set the title and content of the entry.
        entry.Title.Text = title;
        entry.Content.Content = contents;
    
        // Set a location for the event.
        Where eventLocation = new Where();
        eventLocation.ValueString = location;
        entry.Locations.Add(eventLocation);
    
        When eventTime = new When(startTime, endTime);
        entry.Times.Add(eventTime);
    
        Uri postUri = new Uri
    	("http://www.google.com/calendar/feeds/default/private/full");
    
        // Send the request and receive the response:
        AtomEntry insertedEntry = service.Insert(postUri, entry);
    }   

Google 适配器项目

此项目具有 GoogleEventsSyncDataSource 类,该类将处理我们上面描述的 Helper 类的所有操作。ISyncDataSource 接口被继承到 GoogleEventsSyncDataSource 类中,并且这些接口签名(例如 GetItemHeaders )的类型为 IEnumerable<T> ,并且具有一个参数,即 lastSyncTime ,您需要提供日期和时间。LoadItemContents 在此示例中未使用,但如果需要,您可以实现它。WriteItems 有一个 IEnumerable<T> 类型的参数,当您将事件写入 Google 时需要提供它。

GoogleEventsSyncDataSource.JPG

GoogleEventsSyncDataSource 承包商将创建一个您稍后需要的服务对象。
注意:您必须根据需要更改用户名和密码。

namespace GoogleAdapter
{
    public class GoogleEventsSyncDataSource : ISyncDataSource<GenericEvent>
    {
        CalendarService service;

        public GoogleEventsSyncDataSource()
        {
            service = CalendarHelper.GetService("AAA", "mygmail@gmail.com", "mypassword");
        }

        #region ISyncDataSource<GenericEvent> Members

        public string Id
        {
            get { return "Google Calander Sync Data Source"; }
        }

        public IEnumerable<GenericEvent> GetItemHeaders(DateTime? lastSyncTime)
        {
            var googleEvents = CalendarHelper.GetAllEvents(service, lastSyncTime);
            List<GenericEvent> genericEvents = new List<GenericEvent>();
            foreach (var googleEvent in googleEvents)
            {
                GenericEvent genericEvent = new GenericEvent();
                genericEvent.Title = googleEvent.Title.Text;
                genericEvent.Contents = googleEvent.Content.Content;
                genericEvent.Location = googleEvent.Locations.First().ValueString;
                genericEvent.StartTime = googleEvent.Times.First().StartTime;
                genericEvent.EndTime = googleEvent.Times.First().EndTime;
                genericEvents.Add(genericEvent);
            }
            return genericEvents;
        }

        public void LoadItemContents(IEnumerable<GenericEvent> items)
        {
            //Nothing to load here
        }

        public void WriteItems(IEnumerable<GenericEvent> items)
        {
            foreach (var item in items)
            {
                CalendarHelper.AddEvent(service, item.Title, 
		item.Contents, item.Location, item.StartTime, item.EndTime);
            }
        }

        #endregion
    }
}

通用实体项目

此项目具有用于创建事件集合的通用事件(日历)。

GenericEvent.JPG

如果需要,已实现 IEquatable 接口用于事件数据的比较。

namespace GenericEntities
{
    public class GenericEvent : IEquatable<GenericEvent>
    {
        public string Title { get; set; }
        public string Contents { get; set; }
        public string Location { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }

        #region IEquatable<GenericEvent> Members

        public bool Equals(GenericEvent other)
        {
            //Compare all fields to check equality
            if (this.Title == other.Title &&
                this.Contents == other.Contents &&
                this.Location == other.Location &&
                this.StartTime == other.StartTime &&
                this.EndTime == other.EndTime)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        #endregion
    }
} 

DataSynchronizer 项目

SyncManager.cs 将从 Google 返回日历列表。

namespace DataSynchronizer
{
    public class SyncManager<T> where T:IEquatable<T>
    {
        public string Name { get; set; }
        public ISyncDataSource<T> Source1 { get; set; }

        public IEnumerable<T> Synchronize(DateTime? lastSyncTime)
        {
            try
            {
                IEnumerable<T> list = Source1.GetItemHeaders(lastSyncTime).ToList();
                return list;
               
            }
            catch (Exception ex)
            {
                throw ex;
            }
           
        }
    }
}

ISyncDataSource.cs 接口

namespace DataSynchronizer
{
    public interface ISyncDataSource<T> where T : IEquatable<T>
    {
        string Id { get; }
        IEnumerable<T> GetItemHeaders(DateTime? lastSyncTime);
        void LoadItemContents(IEnumerable<T> items);
        void WriteItems(IEnumerable<T> items);
    }
} 

DataSynchronizationService 项目

这是一个高级服务,将由您的应用程序调用。这里 eventManager GenericEvent 的通用类型。您可以通过创建帮助程序和通用类型来添加其他 Google 服务。

namespace DataSynchronizer
{
    public class SyncService
    {
        SyncManager<GenericEvent> eventManager = new SyncManager<GenericEvent>();
        public string LastUpdateDate;
        public SyncService()
        {
            //Initialize Event Manager
            eventManager.Name = "..Event Synchronizer";
            eventManager.Source1 = new GoogleEventsSyncDataSource();
        }

        public IList  SynchronizeEvents()
        {
            IList list = eventManager.Synchronize(DateTime.Now).ToList();
            return list;
        }
    }
} 

如何测试此应用程序:TestApplication 项目

服务实例是 DataSynchronizationServiceSyncService 的一个类型

namespace TestApplication
{
    public partial class Form1 : Form
    {
        SyncService service = new SyncService();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IList  list = service.SynchronizeEvents();
            dataGridView1.DataSource = list;
        }
    }    
} 
© . All rights reserved.