引言
最近不是太忙,花了一些時間學習android的應用開發。經過兩個星期的學習,學習的同時還寫了很多的demo示例,可以從基本控件及基本動畫效果等示例demo集合大放送,持續更新下載。
從這個星期開始,準備拿新浪微博開放平臺做個實踐,開發一個功能簡單的android客戶端,會儘可能的完善功能。
今天的內容
上圖是這個客戶端的主要界面,目前只是獲取了前20條數據,還可以通過refresh點擊刷新數據。功能還比較簡單。
運行的系統是android2.2.
使用到的技術點包括ListView,自定義ListAdapter,多線程相關的Message,Handler,驗證相關的OAuth,用戶圖片的異步加載。
新浪微博的驗證使用的是signpost的OAuth組件,沒有使用微博的SDK。
源碼下載: SinaWeibo2
源碼下載之後,將後綴改爲rar,使用壓縮軟件解壓即可。
關於OAuth驗證
OAuth是當下流行的授權方案,twitter,facebook,google等大型網站的開放平臺都支持了oauth驗證模式,國內的新浪微博、騰訊微博、163微博的開放平臺也相繼支持了這種驗證模式。
引用維基百科的相關說明
“oauth是一個開放的標準,允許用戶讓第三方應用訪問該用戶放在某一個網站的私密資源,而無需將用戶名和密碼傳遞給第三方應用。oauth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。”
舉例來說就是:
用戶A在服務提供者B上存放了一些資源,B支持oauth授權模式,A在B上是註冊用戶,有用戶名和密碼,使用用戶名和密碼登陸B就可以查看自己的資源。假設有一個應用C,用戶A在使用C的時候需要自己在B上存放的資源。有兩種方法來實現C上顯示自己在B上的資源。
- 一種是在C上輸入自己在B的用戶名和密碼,讓C幫自己登陸,獲取資源,然後顯示在C上,但是這麼做太不放心了,C是一個什麼樣的應用,用戶A不放心把B的用戶名和密碼交給C。
- 第二種是在C上也存放一份相關資源,這樣C就直接顯示用戶A在C上的資源就可以了。這樣的話,用戶的維護量就會很大,資源的同步更新很讓人頭疼的。
這時候C就可以使用B開放的oauth授權機制了,用戶A在想要顯示B上的資源的時候,C會跳轉到B的驗證頁面,用戶在B的頁面輸入用戶名和密碼,通過之後,會詢問用戶是否開發相關的資源給C應用,用戶可以自定義C可以訪問的資源,然後再跳轉回C應用。這樣既不用擔心用戶名和密碼的問題,又不用同時存放多份資源造成的維護問題了。
大家可以通過下面的網站詳細瞭解oauth的具體技術細節。
從上圖我們可以看出,真個過程分爲consumer和provider兩個部分。consumer也就是例子中的c應用,provider就是例子中的B服務提供者。
使用OAuth進行認證和授權的過程如下所示:
- 用戶訪問客戶端的網站,想操作用戶存放在服務提供方的資源。
- 客戶端向服務提供方請求一個臨時令牌。
- 服務提供方驗證客戶端的身份後,授予一個臨時令牌。
- 客戶端獲得臨時令牌後,將用戶引導至服務提供方的授權頁面請求用戶授權。在這個過程中將臨時令牌和客戶端的回調連接發送給服務提供方。
- 用戶在服務提供方的網頁上輸入用戶名和密碼,然後授權該客戶端訪問所請求的資源。
- 授權成功後,服務提供方引導用戶返回客戶端的網頁。
- 客戶端根據臨時令牌從服務提供方那裏獲取訪問令牌。
- 服務提供方根據臨時令牌和用戶的授權情況授予客戶端訪問令牌。
- 客戶端使用獲取的訪問令牌訪問存放在服務提供方上的受保護的資源。
新浪微博的oauth
借用一張新浪微博的oauth驗證流程圖。
我們再新浪微博開放平臺新建應用的時候都會分配給新建應用一個key和secret,也就是consumerKey和consumerSecret。通過這兩個東西,我們去request_token,然後將用戶重定向到新浪微博平臺的授權頁面,授權之後,根據callback_url跳轉會我們應用的一個地址,我們再次使用request_token獲取access_token,在後面就需要通過access token來訪問開放平臺提供的需要驗證的接口了。
當然了,那些不需要驗證就可以訪問的接口,就直接使用key就可以訪問了,詳情可以參考開放平臺提供的API文檔。
騰訊微博和163微博的開放平臺也是類似的原理和實現。
package com.sinaweibo2; import oauth.signpost.OAuthConsumer; import oauth.signpost.OAuthProvider; import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; import oauth.signpost.commonshttp.CommonsHttpOAuthProvider; import oauth.signpost.exception.OAuthCommunicationException; import oauth.signpost.exception.OAuthExpectationFailedException; import oauth.signpost.exception.OAuthMessageSignerException; import oauth.signpost.exception.OAuthNotAuthorizedException; public class OAuth { private OAuthConsumer mConsumer; private OAuthProvider mProvider; public static final String CALLBACK_URL = "sinaweibo2://WeiboListActivity"; public static final String CONSUMER_KEY = "1849239616"; public static final String CONSUMER_SECRET = "b2137bf782bf6cae004b8a8394d5d5d6"; public static final String REQUEST_TOKEN_URL = "http://api.t.sina.com.cn/oauth/request_token"; public static final String ACCESS_TOKEN_URL = "http://api.t.sina.com.cn/oauth/access_token"; public static final String AUTHORIZE_URL = "http://api.t.sina.com.cn/oauth/authorize"; public OAuth() { } public String RetrieveAuthUrl() throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException, OAuthCommunicationException { mConsumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); mProvider = new CommonsHttpOAuthProvider(REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, AUTHORIZE_URL); String authUrl= mProvider.retrieveRequestToken(mConsumer, CALLBACK_URL); return authUrl; } public void RetrieveAccessToken(String verifier) throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException, OAuthCommunicationException { mProvider.setOAuth10a(true); mProvider.retrieveAccessToken(mConsumer, verifier); OAuthUser.USER_ID=mProvider.getResponseParameters().getFirst("user_id"); OAuthUser.ACCESS_TOKEN = mConsumer.getToken(); OAuthUser.ACCESS_TOKEN_SECRET = mConsumer.getTokenSecret(); } }
更多功能
接下來,有兩個主要的功能會完善,一個是分頁瀏覽,一個是發表微博。
往後,可能會支持圖片發表等實用功能。
還有就是UI的美化,性能的優化。
總結
學習的過程中看過兩本書,Pro.Android.2.pdf和Professional.Android.2.Application.Development.(Wrox,.2010,.0470565527).pdf,都是很不錯的入門書籍。書我沒有全看完,看完大部分吧,邊看邊寫demo。
同時每天泡論壇http://www.eoeandroid.com/forum.php,eoe的開發者門戶。回答問題,解決問題,提出問題,發帖子,總之就是鍛鍊自己,強迫自己鍛鍊基礎和思考。
在論壇上,有很多的中文pdf教程,但是發現大多都是翻譯android developer center的Dev Guide和Resources中的內容。所以覺得,如果英文不是很差,建議直接閱讀上面的兩個板塊,同時練習其中的示例,保證兩個星期,你會有很大的進步。
參考資料
http://developer.android.com/index.html
http://www.cnblogs.com/hll2008/archive/2011/01/03/1923674.html
http://open.weibo.com/wiki/Oauth
http://blog.csdn.net/lihenair/article/details/6010026
http://www.cnblogs.com/liangxing/archive/2010/10/19/1855938.html
http://code.google.com/p/oauth-signpost/wiki/GettingStarted