使用googleapi-client-java操作gtasks(一)

Google Tasks的API終於開放了,可以方便的保存樹狀工作任務,對照文檔和例子摸索了一遍,將一些關鍵點給大家分享一下。

如果對於googleapi-client-java庫沒什麼瞭解,可以參考我前面的一篇文章:
[url]http://mypyg.iteye.com/admin/blogs/816237[/url]
當然這個庫自從那個時候後又更新了很多,好用多了。

下載庫:
http://code.google.com/p/google-api-java-client/wiki/APIs
這裏面的包每個都包含了google api client,並且根據服務的不同,進行了各自的擴展,我們這兒選擇Tasks的API,下載庫,另外還有文檔,還有個更有意思的:[url]https://code.google.com/apis/explorer/#_s=tasks&_v=v1[/url],API瀏覽頁面,可以直接輸入法參數然後與服務器通信很直觀的看到與服務器交換的數據內容,因爲要訪問個人數據,使用explorer時注意右上角 Switch to Private Access,切換到授權模式。
閱讀示例代碼[url]http://code.google.com/p/google-api-java-client/source/browse/taskqueue-json-oauth-sample?repo=samples[/url]

打開eclipse,首選創建一個空project,將剛纔下載的zip包導入此項目,以方便其他項目引用其中的jar包。

然後創建一個新項目,設置build path,要手工加上以下幾個包的依賴:
google-api-client-1.7.0
google-api-client-android2-1.7.0
google-api-tasks-v1-rev2-java-1.4.0
google-http-client-1.7.0
google-http-client-android2-1.7.0
google-oauth-client
guava-11.0.1
jackson-coer-asl
如果不加的話,最終生成apk包時不會包含,會導致運行時出現類找不到的情況。
其中android2的兩個包時針對android sdk 2以上平臺的,都是在相應的通用包上作了一點擴展,但是並沒有包含通用包,所以對應的通用包也要加入build path。如果sdk是3的,那麼就替換成android3的包。

使用google服務的流程:
1.使用用戶名、密碼獲取授權Token(令牌,沒有的話google不讓訪問數據,使用用戶名和密碼從google服務器獲得)。
2.使用授權字符串以及其他的參數發送http請求。
3.解析響應,並處理結果。
在Android平臺上獲取授權可以通過AccountManager服務來實現,只要有綁定的Gmail賬戶,就無須再次輸入密碼。發送請求以及解析響應則通過googleapi-client-java庫中封裝的函數來實現了。
下面就結合實際的代碼做下說明:
基礎類:
com.google.api.services.tasks.v1.Tasks.Tasks:Tasks服務的封裝類。
構造函數:
Tasks(HttpTransport transport, HttpRequestInitializer requestInitializer, JsonFactory jsonFactory)

參數transport:通過http交互數據的封裝類。
參數requestInitializer:對http request進行初始化的對象
參數jsonFactory:解析、構造json數據的對象
代碼片段(代碼具體位置參見附件,文章的代碼只是爲了方便講解,位置都是亂的):
1.基本對象
/**
*保存Token的類,實現了接口HttpRequestInitializer,會在HTTP請求頭中增加一行
*Authorization: Oath {你得到的token}
**/
private GoogleAccessProtectedResource mAccessProtectedResource = new GoogleAccessProtectedResource(null);
//通過Http協議傳輸數據的類
private final HttpTransport mTransport = AndroidHttp.newCompatibleTransport();
//Google Tasks服務對象
private Tasks mService = new Tasks(mTransport, mAccessProtectedResource, new JacksonFactory());
//賬戶管理對象
private GoogleAccountManager mAccountManager = new GoogleAccountManager(this);

2.獲得Token並保存

//token類型:tasks的約定即爲此字符串。不要漏了前面的oauth2:否則一直提示密碼錯誤
//或者使用tasks的auth token類型別名"Manage your tasks"。參見:http://code.google.com/apis/tasks/oauth-android-auth-token-type-aliases.html
//這樣用戶看到的就不是一個url,而是一個可以理解的字符串。
//所有的別名列表網上找不到了,好多人在問
private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";
//獲取Token
mAccountManager.manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bundle = future.getResult();
if(bundle.containsKey(AccountManager.KEY_INTENT)) {
Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
//彈出窗口用戶選擇是否允許訪問Google Tasks數據
startActivityForResult(intent, REQUEST_AUTHENTICATE);
}else if(bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
//得到授權字符串並保存
mAccessProtectedResource.setAccessToken(bundle.getString(AccountManager.KEY_AUTHTOKEN));
//從服務器獲取數據
onAuthToken();
}
}catch(Exception e) {
handleException(e);
}

}
}, null);

3.從服務器獲取數據:
private void onAuthToken() {
List<String> tasks = new ArrayList<String>();
try {
/*向服務器發送請求,並解析成列表。
在這個過程中實際上向服務器發送了:
GET https://www.googleapis.com/tasks/v1/users/@me/lists
Authorization: OAuth {Token xxx x xx x x x}
X-JavaScript-User-Agent: Google APIs Explorer google-api-gwt-client/0.1-alpha
服務器迴應了:
200 OK
以及一個包含有所有列表的Json對象。
*/
List<TaskList> lists = mService.tasklists.list().execute().items;
for(TaskList tl : lists) {
tasks.add(tl.title);
}
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tasks));
} catch (IOException e) {
handleException(e);
}
}


4.關於API KEY:
如果直接使用Google的例子編譯後運行,會發現服務器迴應400 Bad request,跟蹤發現是因爲API KEY沒有設置的原因(訪問Google Calendar就沒這個限制),Google爲了防止資源被濫用,通過API KEY來限制Ap,比如Gtasks就限制每個API KEY每天只能訪問5000次(一個請求就是1次),而且API KEY是跟着Ap走的,比如一個Ap有5000個人安裝了,那麼平均每個人每天只能訪問1次Google Tasks服務了,即使這5000個人有5000個Google賬戶也是被這麼限制。那麼如何不受此限制呢?
我想的方法之一是Ap啓動時,要求用戶輸入自己的API KEY,那麼這樣所有的用戶就互不干擾了,各自都有5000次的可用次數了。
API Key的獲得:
直接訪問網址:[url]https://code.google.com/apis/console#access[/url]
如果從來沒有來過此網址,那麼第一頁會讓你create project,點擊後進入下一個頁面,選擇Services,把Tasks API的開關選擇爲ON,再選擇API Access,在Simple API Access的框內就可以看到API KEY了,複製了即可。
API KEY在代碼中的設置:
mService.accessKey = 你的API_KEY;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章