Windows Phone 7 – 學習使用Live SDK
隨著Windows Live不斷地改版為SkyDrive 增加了很多新的功能,再加上WP7本身也提供很多地方與SkyDrive 的連結,例如:
Office或如同<Windows Phone Mango 7712: Streaming music and video from the Skrydrive through the browser>這篇的介紹,
讓SkyDrive成為與WP7手機一個儲存與互動的重要媒介。因此,在撰寫App時如果需要提供用戶備份使用設定的功能,過去可以透
過DropBox,那我就想說即然是WP7為何不直接使用SkyDrive就好了呢?因此,往下介紹怎麼在WP7中存取SkyDrive。
〉Live SDK (Live Connect):
在2011年底MS釋出了Live SDK,該SDK幫助開發人員解決了需實作OAuth交易的複雜工作,並且採用標準的OAuth 2.0、JSON與
Extensible Messaging and Presence Protocol (XMPP)為支援協定。透過REST的方式來呼叫API,而回傳的結果採用JSON的方式進
行溝通。因此,該API支援各種平台:Web、Desktop、Mobile app。那麼Live Connect提供了那些Services呢?
‧Skydrive:
支援開發的應用程式指定Windows Live ID藉由Live Connect API存取Skydrvice中的文件與多媒體,包括:新/修/刪/查檔案與資料夾。
‧Hotmail:
支援存取Windows Live ID上的連絡人與行事曆,讓開發的應用程式可建立/編寫聯絡人、建立事件與提醒等。
‧Messenger:
支援與Messenger上的聯絡人進行聊天、取得聯絡人狀態等。
‧Windows Live ID:
用於驗證用戶與連結他們的個人資訊。
以上這些服務與API,讓開發人員可透過網站或App的方式讓用戶隨時與他們的Live功能進行連接。往下介紹相關Live SDK前,使用SDK與
撰寫應用時,要記得注意<Live SDK License Agreement>,不然送審的過程會被退件的,要特別小心。
〉WP7上使用Live Connect操作API (以Managed API為例):
在操作Live Connect之前最重要的一件事情即是讓程式能夠與Windows Live連接。此時,Live SDK已經幫我們準備好了,
在過去使用Facebook API、Plurk API裡有一個重要的就是OAuth,它的機制需先至要操作的服務提供者端申請一組Key與權限,
接著在App裡建立讓用戶可以登入該服務網站,並且有介面允許授權存取能力給該App,這些動作雖然說沒有很難做,但對於第
一次使用的人難免有些混亂的概念,但Live SDK已經包裝好了,讓我們很簡單的能力操作它。
以C#為例,操作Live SDK有三個重要的元素:
(1). Microsoft.Live:
集合包含了讓開發者簡易地連接Live Connect OAuth進行驗證,以及取得User Session Data與Live Connect REST APIs。
以下就擷錄<Microsoft.Live namespace>針對Microsoft.Live命名空間重要的類別做一些說明:
Class | Description |
LiveAuthClient | 用於擷取Live Connect連線過程的Session Data。 二個重要的參數:client ID and redirect Uniform Resource Identifier (URI)。 |
LiveAuthException | 用於識別當Auth Process過程發生Exception時的處理常式。 |
LiveConnectClient | Live Connect的重要功能,用與Live Connect web service endpoints連接,並且管理Token保持連線的驗證與交易憑證。 另外,它更包括重要操作Windows Live上必要的方法: CopyAsync, DeleteAsync, DownloadAsync, UploadAsync, PostAsync,用於操作WP7的資源發佈或下載至二端之間。 |
LiveConnectException | 用於識別當Connect Process過程發生Excpetion時的處理常式。 |
LiveConnectSession | 用於取得目前Connect的Session。其內容包括:目前與Live Connect使用的Token有效期限、Token屬性等。 |
LiveDownloadProgressChangeEventArgs | 在Download Operation過程中每一時間點下載數據量的改變參數。 |
LiveOperationCompletedEventArgs | 當Operation完成時所觸發的事件處理參數。 |
LiveUploadProgressChangedEventArgs | 在Upload Operaion過程中每一時間點下載數據量的改變參數。 |
LoginCompletedEventArgs | 當登入完成時所觸發的事件並且回傳需要的事件參數。 |
上表中提到數個重要類別,以LiveConnectClient最為重要,因此,以下範例將使用該類別實作相關Windows Live上的功能。
(2). Microsoft.Live.Controls:
該Controls提供用於操作Live Connect的特性,最常見的即是:「SignInButton class」。在WP7使用Live SDK第一步即是需要將它加入
至應用程式,並指定ClientID與Scope屬性告知它該使用怎樣的OAuth驗證來連上Windows Live,這樣才能透過OAuth標準讓用戶授權應用
程式可以存取他的Live ID資訊與相關功能。
在使用SignInButton時,有一些參數可搭配使用:
(2-1). BrandingType enumeration:該列舉設定後,Button可呈現對應API的圖標,例如:Hotmail、SkyDrive、Messenger、Windows。
(2-2). ButtonTextType enumeration:該列舉設定後,Button可呈現相關的文字說明,例如:Connect、Custom、Login、Sigin。
(2-3). LiveConnectSessionChangedEventArgs class:
使用SingInButton時搭配「SessionChanged」處理常式所代入的事件參數,用於監控Live Connect連線時Session的改變。
(3) Socpes and Permissions (學習Live SDK該部分的觀念一定要先建立):
Microsoft.Live與Microsoft.Live.Controls提供App方便使用OAuth協定登入Live Connect,但在讓開發的App可以連接Live Connect前,
在Live Connect API有定義App存取權限觀念,在Live Connect API稱為Scopes,每一個Scopes代表不同的Permission Level與對應的參數。
然而,針對Scopes Types主要分成三種類型,這三種類型有對應的參數是撰寫App時可以用來取得實際資料的部分,往下將加以說明:
(3-1). Core scopes:
為重要連接Live Connect APIs與涉及使用者的核心資料與聯絡人資訊。主要範圍主要有三類:
Scope | Enables |
wl.basic | 讀取已連結的用戶基本資訊,與聯絡人清單。存取REST中的User與Contact二大物件。 |
wl.offline_access | 允許App有能力在任何時間讀取與更新用戶的資料。如果沒有設定該值,App只能在每一次進行登入連接Live Connect才能操作。 |
wl.signin | 單一登入行為(Single sign-in behavior)。設定該值,用戶透過App登入Live Connect也一併登入WebSite。更詳細的說明可參考<Signing users in>。 |
從上述即可得知這三個Scopes是讓App可以存取/控制資料的基本設定值,在wl.basic的物件結構要特別注意,如下:
REST Object | Structure (取值的,key) |
User | link |
User | update_time |
Contact | id |
Contact | first_name |
Contact | last_name |
Contact | name |
Contact | gender |
Contact | is_friend |
Contact | is_favorite |
Contact | user_id |
Contact | email_hashes |
Contact | birth_day (存取該結構值,需要scope多增加:wl.contacts_birthday)。 |
Contact | birth_moth (存取該結構值,需要scope多增加:wl.contacts_birthday)。 |
Contact | updated_time |
更詳細的存取物件結構,可以參考<REST API>。
(3-2). Extends:
該scopes允許App操作使用者的延伸性個人資料與聯絡人資訊。其主要範圍相當多:
Scope | Enables |
wl.birthday | 讀取用戶的生日資訊,包括:年(birth_year)/月(birth_month)/日(birth_day)。 |
wl.calendars | 讀取用戶的行事曆與事件資訊。 |
wl.calendars_update | 存取(r/w)用戶的行事曆與事件。 |
wl.contacts_birthday | 讀取用戶所有聯絡人生日(年/月/日)。配合wl.basic中birth_day, birth_moth使用。 |
wl.contacts_calendars | 讀取用戶所屬與其他人分享給該用戶的行事曆與事件資訊。 |
wl.contacts_create | 建立新的聯絡人至用戶的通訊錄。 |
wl.contacts_photos | 讀取用戶的albums、photos、videos與audios,以及這些資源的相關comments與tags;也支援讀取其他用戶分享給該用戶的資源。 操作元件:Album, Audio, Photo, and Video objects。 |
wl.contacts_skydrive | 讀取其他用戶分享給該用戶的skydrive資源,也能存取用戶所屬的skydrive資源。 |
wl.emails | 讀取用戶的personal、preferred與business email。 可用結構:emails / preferred / account / personal / business。 |
wl.events_create | 建立事件在該用戶default的行事曆。操作元件:Event object。 |
wl.messenger | 允許登入Windows Live Messenger與Presence Protocol (XMPP) service。 詳細內容可以參考<Getting started using Messenger with XMPP>的介紹。 |
wl.phone_numbers | 讀取用戶的personal、preferred與business phone number。 可用結構:phones / personal / business / mobile。 |
wl.photos | 讀取用戶的albums、photos、videos與audios。 |
wl.postal_addresses | 讀取用戶的postal address。可用結構相當多,可以點擊連結。 |
wl.share | 允許更新用戶的狀態訊息。存取的物件:Activity Object。 |
wl.skydrive | 讀取用戶所屬Skydrive中的檔案。 |
wl.skydrive_update | 存取(r/w)用戶所屬Skydrive中的檔案。 |
wl.work_profile | 讀取用戶的員工與工作地址資訊。 可用結構:work / employee (work array) / name (employee object) / position (work array) / name (position object) |
更詳細的存取物件結構,可以參考<REST API>。
(3-3). Developers:該scopes允許App使用開發者的Client IDs進行操作。
Scope | Enables |
wl.applications | 讀取開發者的Client ID,該Client ID驗證後,可配合Live Connect APIs產生功用。 操作元件:Application object's structures,用於取得該Client ID在Live Connect上註冊的相關資訊。 |
wl.applications_create | 代表開發者建立了一個新的Client ID。操作元件:Application object's structures。 |
更詳細的存取物件結構,可以參考<REST API>。
以上介紹了Live SDK重要的觀念與使用的元件/參數之後,還有蠻多的Structure需要參考額外的資料進行說明,
但往下先接著透過幾個簡單的範例介紹如何操作Live SDK。
[事前工作]
在體驗使用Live SDK時,首先第一個任務需要至「https://manage.dev.live.com/Applications/Index」申請您實作App使用的
Client ID,該Client ID用於識別App在Live Connect定義為何種應用程式,由於它需要綁定一組Windows Live ID,因此需要透過
一個可接收核可性的ID來當作申請。申請方式非常容易,在這篇就不多加以說明。產生Client ID的結果如下:
記得來<Live Software Development Kit (SDK)>安裝Live SDK。
A. 登入Windws Live:
擷錄<>中的內容,參考Core Scope設定讓App提供用戶可以登入Windows Live,並且取得用戶的資訊。其設定步驟如下:
(a-1). 拉SigninButton至畫面中,設定Scopes與Client ID;(至於怎麼在Tools加上SigninButton,請參考<Referencing the APIs with C#>)
1: <!--TitlePanel contains the name of the application and page title-->
2: <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
3: <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
4: <my:SignInButton Name="btnLogin"
5: Scopes="wl.signin wl.basic wl.offline_access"
6: SessionChanged="btnLogin_SessionChanged"
7: HorizontalAlignment="Left"
8: ClientId="00000000480715FF"
9: />
10: </StackPanel>
設定Scopes包括三個Core scopes:wl.signin wl.basic wl.offline_access三個用「空白」隔開。並且註冊SessionChanged事件,
用於監控Live Controls登入後觸發的狀態改變事件。
(a-2) 建立一個LiveConnectClient變數,並且隨著SigninButton觸發SessionChanged事件來啟動該變數連接Live Connect;
1: private LiveConnectClient gLiveClient;
2:
3: private void btnLogin_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e)
4: {
5: //LiveConnectSessionStatus.Connected代表SigninButton已完成OAuth認證
6: if (e != null && e.Session != null && e.Status == LiveConnectSessionStatus.Connected)
7: {
8: //初始化LiveConnectClient進行存取資料的任務
9: this.gLiveClient = new LiveConnectClient(e.Session);
10: //註冊GetCompleted事件
11: this.gLiveClient.GetCompleted += OnGetMe;
12: //要求取得個人(me)層級的資訊
13: this.gLiveClient.GetAsync("me", null);
14: }
15: else
16: {
17: this.gLiveClient = null;
18: this.tbError.Text = e.Error != null ? e.Error.ToString() : string.Empty;
19: }
20: }
21:
22: private void OnGetMe(object sender, LiveOperationCompletedEventArgs e)
23: {
24: this.gLiveClient.GetCompleted -= OnGetMe;
25: if (e.Error == null)
26: {
27: //使用wl.basic中的contact物件結構:first_name取得值
28: string firstName = e.Result.ContainsKey("first_name") ?
29: e.Result["first_name"] as string : string.Empty;
30:
31: //使用wl.basic中的contact物件結構:last_name取得值
32: string lastName = e.Result.ContainsKey("last_name") ?
33: e.Result["last_name"] as string : string.Empty;
34: this.tbGreeting.Text = "Welcome " + firstName + " " + lastName;
35: }
36: else
37: {
38: this.tbError.Text = e.Error.ToString();
39: }
40: }
在上述的程式範例中,有一個重要的關鍵字:「me」。此時,也許您會覺得奇怪,這個是什麼呢?其me代表的是一個Path的觀念,
它定義了目前要存取的範圍是在何某Path下,例如:存取個人的聯絡人:/me/contacts;某一個用戶的聯絡人:/USER_ID/contacts。
然而,Path的關鍵值,往下將加以說明:
(a-3) Understanding the objects:
對於Live Connect REST API而言,每一個資訊的分類都算是一個Object。該Object包括:子物件集合、陣列、Values。
要怎麼使用這些物件,則需要先了解unique path,它類似ID一樣代表每一個物件存取的識別與範圍。
Object | Description | Value object paths |
Activity | 儲存用戶的活動feed與狀態訊息。 | /me/share /USER_ID/share |
Album | 用戶在Skydrive裡Album的資訊內容。 包括:photos、videos、audios、files與folders的組合。 |
/me/albums /USER_ID/albums /ALBUM_ID 一個Album物件可回傳以下的Path內容: /ALBUM_ID/files /me/skydrive/files /me/skydrive/shared/files /me/skydrive/shared/albums /USER_ID/skydrive/files |
Application | 儲存與Live Connect互動的Client ID資訊。 | /me/applications /USER_ID/applications /APPLICATION_ID |
Audio | 用戶儲存於Skydrive的Audio資訊。 | /AUDIO_ID 一個Audio物件可回傳以下的Path內容: /ALBUM_ID/files /FOLDER_ID/files /me/skydrive/files /USER_ID/skydrive/files |
Calendar | 儲存用戶的Calendar資訊。 | /me/calendars /USER_ID/calendars /CALENDAR_ID |
Comment | 儲存在用戶Skydrive裡photos或videos的Comment資訊。 | /PHOTO_ID/comments /VIDEO_ID/comments /COMMENT_ID |
Contact | 用戶在Hotmail上的聯絡人。如果聯絡人資訊中的is_friend值為true,取出的聯絡人也是friend.。 | /me/contacts /USER_ID/contacts /CONTACT_ID |
Error | 由Live Connect API回傳的錯誤資訊。 | None |
Event | 儲存在用戶Calendar上的事件。 | /me/events /USER_ID/events /CALENDAR_ID/events |
File | 用戶在Skydrive中的檔案。 | /FILE_ID 一個File物件可回傳以下的Path內容: /FOLDER_ID/files /me/skydrive/files /me/skydrive/shared /me/skydrive/shared/files /USER_ID/skydrive/files |
Folder | 用戶在Skydrive中的資料夾。它能包括:photos、videos、audios、files與子資料夾的組合資訊。 | /FOLDER_ID 一個Photo物件可回傳以下的Path內容: /ALBUM_ID/files /FOLDER_ID/files /me/skydrive/files /me/skydrive/shared/files /USER_ID/skydrive/files |
Friend | 用戶朋友的資訊。朋友是聯絡人的子集合,並且搭配publicly visible relationship 定義可見度。因此,Contact物件的資料會比Friend完整。它能取到的內容,最簡單ID與Name。 | /me/friends /USER_ID/friends |
Permissions | 儲存scopes清單。 | /me/permissions /USER_ID/permissions |
Photo | 用戶儲存於Skydrive的Photo資訊。 | /PHOTO_ID 一個Photo物件可回傳以下的Path內容: /ALBUM_ID/files /ALBUM_ID/photos /FOLDER_ID/files /me/skydrive/files /me/skydrive/shared/photos /USER_ID/skydrive/files |
Tag | 在Skydrvice中photo或video上標記的關聯資訊。 | /PHOTO_ID/tags /VIDEO_ID/tags /TAG_ID |
User | 代表一個用戶。 | /me /USER_ID |
Video | 用戶儲存於Skydrive的Video資訊。 | /VIDEO_ID 一個Video物件可回傳以下的Path內容: /ALBUM_ID/files /ALBUM_ID/videos /FOLDER_ID/files /me/skydrive/files /me/skydrive/shared/videos /USER_ID/skydrive/files |
了解上述Path與對應物件使用的方式,簡單的舉個例子:想要取出自己Skydrive中的所有Photo資訊:
1: //"/me/skydrive/files?filter=photos":代表要從自己的Skydrive中找出PHOTOS的檔案
2: this.gLiveClient.GetAsync("/me/skydrive/files?filter=photos", null);
其中過濾的參數可使用:albums、audio、folders、photos、videos。
[範例程式]
由於內容太多了,範例部分移至<Windows Phone 7 – 學習使用Live SDK – 2>加以說明。
======
以上是分享怎麼存取SkyDrvice的內容,因為我覺得透過SkyDrive可以配合很多的應用,因此我自己很希望去了解怎麼存取它的內容,
這樣我就可以放置一些我需要內容在SkyDrive裡,透過自己開發的App去讀取內容或做Shared的功能,至於Shared的功能也可以配合
Socket的應用來進行。因此,WP7裡一個App可以納入很多好用的開發API與概念,讓自己App更加生活化。
References:
‧Live SDK筆記 - 黑暗執行緒 (必讀)
‧Developers – Learn how to bring data from Hotmail, Messenger, and SkyDrive to your mobile apps
‧Windows Phone 7 Skydrive Library (重要) & Welcome to the Live Connect Developer Center
‧SkyDrive Photo API sample for WP7 & Windows Live Client Extensibility APIs
‧SkyDrive .Net API Client & SkyDrive Simple Viewer for WebDAV
‧Download file from skydrive in Windows Phone 7
‧SkyDrive播放器 skyDrive player v1200
‧any api to access windows live services? (skydrive, live space, etc.). How about www.mesh.com?
‧http://social.msdn.microsoft.com/Forums/en-US/messengerconnect/threads
‧ManagedMediaHelpers (重要) & Windows Phone 7 Skydrive Library & WP7Dropbox
‧Live Connect Developer Center (官方開發者網站,重要)
‧Live Connect app management site for Metro style apps (MS提供完整的服務,可參考著使用)