http://www.cnblogs.com/virusswb/archive/2011/08/05/2128941.htmlphp
最近不是太忙,花了一些時間學習android的應用開發。通過兩個星期的學習,學習的同時還寫了不少的demo示例,能夠從基本控件及基本動畫效果等示例demo集合大放送,持續更新下載。html
從這個星期開始,準備拿新浪微博開放平臺作個實踐,開發一個功能簡單的android客戶端,會盡量的完善功能。java
上圖是這個客戶端的主要界面,目前只是獲取了前20條數據,還能夠經過refresh點擊刷新數據。功能還比較簡單。android
運行的系統是android2.2.api
使用到的技術點包括ListView,自定義ListAdapter,多線程相關的Message,Handler,驗證相關的OAuth,用戶圖片的異步加載。多線程
新浪微博的驗證使用的是signpost的OAuth組件,沒有使用微博的SDK。異步
源碼下載: SinaWeibo2ide
源碼下載以後,將後綴改成rar,使用壓縮軟件解壓便可。post
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的具體技術細節。
http://code.google.com/p/oauth-signpost/
![]()
從上圖咱們能夠看出,真個過程分爲consumer和provider兩個部分。consumer也就是例子中的c應用,provider就是例子中的B服務提供者。
使用OAuth進行認證和受權的過程以下所示:
- 用戶訪問客戶端的網站,想操做用戶存放在服務提供方的資源。
- 客戶端向服務提供方請求一個臨時令牌。
- 服務提供方驗證客戶端的身份後,授予一個臨時令牌。
- 客戶端得到臨時令牌後,將用戶引導至服務提供方的受權頁面請求用戶受權。在這個過程當中將臨時令牌和客戶端的回調鏈接發送給服務提供方。
- 用戶在服務提供方的網頁上輸入用戶名和密碼,而後受權該客戶端訪問所請求的資源。
- 受權成功後,服務提供方引導用戶返回客戶端的網頁。
- 客戶端根據臨時令牌從服務提供方那裏獲取訪問令牌。
- 服務提供方根據臨時令牌和用戶的受權狀況授予客戶端訪問令牌。
- 客戶端使用獲取的訪問令牌訪問存放在服務提供方上的受保護的資源。
借用一張新浪微博的oauth驗證流程圖。
咱們再新浪微博開放平臺新建應用的時候都會分配給新建應用一個key和secret,也就是consumerKey和consumerSecret。經過這兩個東西,咱們去request_token,而後將用戶重定向到新浪微博平臺的受權頁面,受權以後,根據callback_url跳轉會咱們應用的一個地址,咱們再次使用request_token獲取access_token,在後面就須要經過access token來訪問開放平臺提供的須要驗證的接口了。
固然了,那些不須要驗證就能夠訪問的接口,就直接使用key就能夠訪問了,詳情能夠參考開放平臺提供的API文檔。
騰訊微博和163微博的開放平臺也是相似的原理和實現。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455package
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 CONSUMER_KEY =
"1849239616"
;
public
static
final
String CONSUMER_SECRET =
"b2137bf782bf6cae004b8a8394d5d5d6"
;
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中的內容。因此以爲,若是英文不是不好,建議直接閱讀上面的兩個板塊,同時練習其中的示例,保證兩個星期,你會有很大的進步。