2011年3月2日 星期三

在WP7中使用Silverlight開發DropBox應用

這篇文章的標題很有趣,WP7是手機、Silverlight是開發技術、DropBox是雲端服務應用...如果你對資訊技術(特別是開發技術)有興趣且持續關注,會發現這三個(類)名詞最近常常似有若無的連結在一起。(以後有機會再分享感觸...)

使用WP7手機好一陣子了,比較特別的地方是,WP7手機沒有檔案系統的概念,而是比較偏向雲端資料儲存機制,也因此,如果你需要Sync PC上的檔案,比較理想的方式是將檔案從PC Sync到雲端(例如Dropbox或是Skydrive),然後再透過手機去讀取...
不過要完成這樣的工作,就得跟雲端服務相關的API打交道了,也就是說,開發人員想要去存取於位於雲端上的檔案,可需要透過該服務提供的API。

DropBox雖然起步不算早,但在檔案存取上已經算是一個典範了。因為這樣,最近開始有ㄧ些機會需要利用silverlight開發技術來存取用戶位於DropBox上的檔案。基本上,API不算複雜,可以參考底下位置:
http://www.dropbox.com/developers

我很喜歡這種簡單好用的API,沒有太多詭譎之處,就很直接了當。如果你是開發人員,想要寫可以存取DropBox的手機或Web應用程式,請參考底下網頁:
http://www.dropbox.com/developers/quickstart


動作是:
先取得一個Developer Key(當然,你先要註冊DropBox帳號,然後進入底下頁面:https://www.dropbox.com/developers/apps )即可在該頁面上申請一個App:


申請完App之後,你會取得一組App Keys和Secret Code,這很重要,寫程式的時候會用到。

接著,就可以來寫程式存取DropBox了,但請先注意,你申請的App目前是開發階段,所以你在測試時只能存取自己的DropBox,程式寫完測試好之後,還得跟DropBox申請Production Key替換掉程式中開發階段的Key,才能正式Release你的應用程式。

要如何透過程式碼存取Dropbox呢?
Silverlight開發人員可以參考底下這組 SDK:
https://github.com/dkarzon/DropNet

下載後請reference幾個.dll,分別是:
DropNet.WindowsPhone.dll
Newtonsoft.Json.Silverlight.dll
RestSharp.WindowsPhone.dll

主要的組件是DropNet.WindowsPhone.dll,其他兩個組件是配合做Rest存取與Json的剖析用的。

接著,你就可以透過底下的程式碼登入:
//建立dropNetClient
if(dropNetClient==null)
    dropNetClient = new DropNet.DropNetClient("你的AppKey", "你的Secret Code");
//Login
dropNetClient.LoginAsync(DropBox使用者帳號, DropBox使用者密碼, (para1) =>
{
    if (para1.Content.IndexOf("error")>0)
    {
        Dispatcher.BeginInvoke(() => {
            MessageBox.Show("Login fail, please make sure account & password is correct and try again, you can edit your account & password in the setting page.");
        });
        return;
    }
    //成功登入後, 取得用戶資訊
    GetUserinfo();
    //取得Public目錄清單
    GotoPath("Public");
}

請特別注意 LoginAsync 的第三個參數,該參數是Action,簡單的說就是一個Call back Method,你可以直接把Login後的動作寫在裡面。例如,我們在成功當入後取得用戶的資訊和public檔案清單。

我們來看public檔案清單的部分:
void GotoPath(string path)
{
    //Get Folder Info
    dropNetClient.GetMetaDataAsync(path,
        (para1) =>
        {
            //DataBinding
            listBox1.Dispatcher.BeginInvoke(() =>
            {
                //取得目錄與檔案
                listBox1.ItemsSource = para1.Data.Contents;
            });
        }
     );
}
請注意在程式碼當中,DropBox API的呼叫都是以非同步的方式來進行,並且在另一個執行緒,因此你會看到有很多的Dispatcher...,而回傳的資料會在para1.data.contents,直接透過Silverlight的DataBinding技術Bind到listBox1上,呈現出的效果如下:

That's all, 就這樣,即可透過Silverlight存取DropBox,當然,這樣只是開始,還有許許多多其他的功能,如果改天有機會再詳述囉...

分享

3 則留言:

jotarun 提到...

真酷! 所以說silver light的相關dll 可以直接用在WP7手機上? (抱歉 問題可能白癡了點XD)

David 提到...

to jotarun,
使用Silverlight 3 compile的部分.dll,是可以用在WP7的, WP7的runtime支援大部分SL3的namespace...

黑黑愛做夢 提到...

想請教David silverlight有沒有轉盤效果的code可以參考呢??謝謝~