WindowPhone 中添加Calendar Appointment
虽然WP Mango已经提供了Reminder和Alarm,但个人更喜欢能将日程安排添加到自带的Calendar 中
可惜WP自带的Task中并没有这个接口
但在wp8 8月泄露的Sdk中发现了SaveAppointmentTask,不知道这个是否会被移植到7.8中
所以目前只能采用一个稍微麻烦点的方法:利用Live SDK
首先我们要去live SDK网站创建一个自己的应用,并且设置该应用为手机应用:
然后下载安装Sdk,新建Wp工程,并且添加引用live sdk的dll
然后在xaml中添加:
xmlns:my="clr-namespace:Microsoft.Live.Controls;assembly=Microsoft.Live.Controls"
然后我们首先要添加live Id的登陆授权:
<my:SignInButton Name="btnSignin" ClientId="Your Client ID" Scopes="wl.signin wl.basic wl.contacts_calendars wl.events_create" Branding="Hotmail" TextType="SignIn" SessionChanged="btnSignin_SessionChanged" HorizontalAlignment="Left" VerticalAlignment="Top" />
ClientId就是刚才申请到客户端ID
SessionChanged是我们定义了一个事件用于判断是否登陆成功。
Scopes是获取授权的作用域范围,包括三种类型:
- 核心作用域
- 扩展作用域
- 开发人员作用域
核心作用域
作用域 | 实现的功能 |
---|---|
对用户的基本个人资料信息进行读取访问。还可实现对用户的联系人列表进行读取访问。 |
|
应用能够随时读取和更新用户的信息。如果没有此作用域,那么,只有当用户已登录 Live Connect 而且正在使用你的应用时,你的应用才能够访问用户的信息。 |
|
单一登录行为。通过单一登录,已登录 Live Connect 的用户也会自动登录到你的网站。 |
扩展作用域
作用域 | 实现的功能 |
---|---|
对用户的生日信息(包括出生日期、月份和年份)进行读取访问。 |
|
对用户的日历和事件进行读取访问。 |
|
对用户的日历和事件进行读写访问。 |
|
对用户的联系人的出生日期和月份进行读取访问。请注意,此作用域还会赋予对用户的出生日期、月份和年份的读取访问权限。 |
|
在用户的通讯簿中创建新联系人。 |
|
对用户的日历和事件进行读取访问。还可实现对其他用户与该用户共享的任何日历和事件进行读取访问。 |
|
对用户的唱片集、照片、视频和音频及其相关的备注和标记进行读取访问。还可实现对其他用户与该用户共享的任何唱片集、照片、视频和音频进行读取访问。 |
|
对其他用户与该用户共享的 Microsoft SkyDrive 文件进行读取访问。请注意,此作用域还会赋予对存储在 SkyDrive 中的用户文件的读取访问权限。 |
|
对用户的个人、首选和商务电子邮件地址进行读取访问。 |
|
在用户的默认日历上创建事件。 |
|
允许登录到 Windows Live Messenger 可扩展消息和状态协议 (XMPP) 服务。 |
|
对用户的个人、商务和移动电话号码进行读取访问。 |
|
对用户的照片、视频、音频和唱片集进行读取访问。 |
|
对用户的邮政地址进行读取访问。 |
|
可实现对用户状态消息的更新。 |
|
对存储在 SkyDrive 中的用户文件进行读取访问。 |
|
对存储在 SkyDrive 中的用户文件进行读写访问。 |
|
对用户的雇主和职位信息进行读取访问。 |
开发人员作用域
作用域 | 实现的功能 |
---|---|
对已经创建的、可以与 Live Connect API 协作的开发人员客户端 ID 进行读取访问。 |
|
代表开发人员创建新的客户端 ID。 |
更多细节参见live sdk介绍:http://msdn.microsoft.com/en-us/library/live/hh826528.aspx
我们在回来说判断登陆授权的SessionChanged
using Microsoft.Live; using Microsoft.Live.Controls; private LiveConnectClient client; private LiveConnectSession session; private void btnSignin_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e) { if (e.Status == LiveConnectSessionStatus.Connected) { session = e.Session; client = new LiveConnectClient(session); infoTextBlock.Text = "Signed in."; } else { infoTextBlock.Text = "Not signed in."; client = null; }
登陆授权后可以添加Calendar Appointment了,我们先看下Calendar中Event的结构
Event 对象
Event 对象包含有关用户的 Hotmail 日历上事件的信息。 Live Connect REST API 支持创建 Event 对象。使用 wl.events_create 作用域仅在用户的默认日历上创建 Event 对象。使用 wl.calendars 作用域在用户的日历上读取 Event 对象。使用 wl.calendars_update 在用户的任一日历上创建 Event 对象。使用 wl.contacts_calendars 作用域从用户好友的日历中读取 Event 对象。
Event 对象包含以下结构。
结构 | 类型 | R/W | 创建时必需 | 说明 |
---|---|---|---|---|
ID |
string |
R |
事件的 ID。 |
|
name |
string |
RW |
是 |
事件的名称,其最长长度为 255 个字符。此结构是必需结构。 |
created_time |
string |
R |
采用 ISO 8601 格式的时间,表示事件的创建时间。 |
|
updated_time |
string |
R |
采用 ISO 8601 格式的时间,表示事件的更新时间。此结构仅在事件成功创建时返回的 Event 对象中可见。 |
|
description |
string |
RW |
是 |
事件的描述,其最长长度为 32,768 个字符。此结构是必需结构。 |
calendar_id |
object |
R |
包含事件的日历的 ID。 |
|
from |
object |
R |
包含组织者的名称和 ID 的对象。 |
|
name (from 对象) |
string |
R |
组织者的名称。 |
|
id (from 对象) |
string |
R |
组织者的 ID。 |
|
start_time |
string |
RW |
是 |
采用 ISO 8601 格式的事件开始时间。 在开始读取事件时,时间将是用户的本地时间,采用 ISO 8601 格式。 |
end_time |
string |
RW |
采用 ISO 8601 格式的事件结束时间。如果未指定结束时间,则默认值为 start_time 后的 30 分钟。创建事件时此结构可选。 在开始读取事件时,时间将是用户的本地时间,采用 ISO 8601 格式。 |
|
location |
string |
RW |
事件将发生的位置的名称。最大长度为 1,000 个字符。 |
|
is_all_day_event |
true/false |
RW |
用于指定事件是否为全天事件的值。如果事件是全天事件,则此值为 true;否则为 false。如果缺少此结构,则默认值为 false。 |
|
is_recurrent |
true/false |
R |
用于指定事件是否为重复事件的值。如果事件为重复事件,则此值为 true;否则为 false。 |
|
recurrence |
string |
R |
重复模式的文本描述,例如“每周周二发生”。如果这不是重复事件,则该值为 Null。 |
|
reminder_time |
number |
RW |
发生提醒警报事件前的时间,以分钟为单位。 |
|
availability |
string |
RW |
用户的事件可用性状态。有效值包括:
|
|
visibility |
string |
RW |
用于指定事件是否公开可见的值。 有效值包括:
|
在代码中添加Calendar Appointment:
private void CreateAppointment() { try { var calEvent = new Dictionary<string, object>(); calEvent.Add("name", "国庆测试"); calEvent.Add("description", "国庆测试"); calEvent.Add("start_time", "2012-10-01T13:30:00+08:00"); //calEvent.Add("end_time", "2012-10-01T13:50:00+08:00"); calEvent.Add("location", "home"); calEvent.Add("is_all_day_event", false); calEvent.Add("reminder_time", 30); calEvent.Add("availability", "busy"); calEvent.Add("visibility", "public"); LiveConnectClient createEvent = new LiveConnectClient(session); createEvent.PostCompleted += new EventHandler<LiveOperationCompletedEventArgs>(createEvent_PostCompleted); createEvent.PostAsync("me/events", calEvent); } catch (LiveConnectException exception) { this.infoTextBlock.Text = "Error creating event: " + exception.Message; } } void createEvent_PostCompleted(object sender, LiveOperationCompletedEventArgs e) { if (e.Error == null) { infoTextBlock.Text = "Event " + e.Result["name"].ToString() + " created with ID " + e.Result["id"].ToString(); } else { infoTextBlock.Text = "Error calling API: " + e.Error.ToString(); } }
注意:开始时间和结束时间必须用下列受支持的格式之一来表示。
- 时间必须以下列格式之一开头:yyyy-mm-ddThh:mm:ss、yyyy-mm-ddThh:mm:ss.sss 或 yyyy-mm-dd hh:mm:ss。例如,2011-05-10T14:29:00.000 表示 2011 年 5 月 10 日下午 2:29。
- 时间必须以下列格式之一结尾:+hhmm、
-
hhmm、+hh:mm、-hh:mm 或 Z。这些格式将小时和分钟数表示为相对于 UTC 的偏移量。例如,-0700 表 UTC 之前七个小时。如果将此时间与上例结合使用,则结果为 2011-05-10T14:29:00.000-0700(表示 2011 年 5 月 10 日早晨 7:29)。注意 如果未指定 Z,则时间将被视为本地时间。而且,如果未指定 end_time,则默认的结束时间为指定 start_time 之后的 30 分钟。
执行完毕,我们就可以在live Calendar 看到添加的Appointment了:
Appointment很快就可以同步到我们的WP上去(当然前提你添加Calendar 的账户需要是你WP绑定的账户哦)
当然live sdk还有更多的功能:
更多见:http://msdn.microsoft.com/en-us/library/live/ff621314.aspx