軟件開發(fā)工具:第15章 Android賬戶管理_第1頁
軟件開發(fā)工具:第15章 Android賬戶管理_第2頁
軟件開發(fā)工具:第15章 Android賬戶管理_第3頁
軟件開發(fā)工具:第15章 Android賬戶管理_第4頁
軟件開發(fā)工具:第15章 Android賬戶管理_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、鄭州大學(xué)信息工程學(xué)院第15章 Android賬戶管理點擊添加文本鄭州大學(xué)信息工程學(xué)院15.1 賬戶管理相關(guān)類15.2 使用OAuth2.0來進(jìn)行鑒定15.3 應(yīng)用程序?qū)ぬ栕缘较到y(tǒng)中15.4 創(chuàng)建自定義賬戶示例15.5 本章小結(jié)本章導(dǎo)讀本章導(dǎo)讀:使用過Android版的Facebook、Lastfm的同學(xué)是否對于這些應(yīng)用的功能感到驚喜,它們可以定期更新朋友的最新信息,將最新近況和心情短語集成入聯(lián)系人中。這些應(yīng)用全部是以Android 2.0后的賬戶和同步機(jī)制為基礎(chǔ)的。本章主要知識點有:(1)Android賬戶管理相關(guān)類簡介;(2)使用OAuth2.0來進(jìn)行鑒定;(3)應(yīng)用程序如何將一個帳號注

2、冊到系統(tǒng)中;(4)創(chuàng)建自定義賬戶示例。重點介紹基于OAuth2.0的第三方登錄SDK。15.1 賬戶管理相關(guān)類1Account簡介android中的android.accounts.Account代表的是手機(jī)的基本賬號信息(name和type)。 我們可以通過AccountManager取得Android手機(jī)的所有賬號。比如:AccountManager am = AccountManager.get(context);Account accounts = am.getAccounts();15.1 賬戶管理相關(guān)類2AbstractAccountAuthenticator簡介android.a

3、ccounts.AbstractAccountAuthenticator是一個抽象類。它定義處理Android系統(tǒng)賬戶的添加和驗證等功能的基本接口,并實現(xiàn)了一些基本功能。15.1 賬戶管理相關(guān)類3AccountAuthenticatorActivity簡介android.accounts.AccountAuthenticatorActivity是AbstractAccountAuthenticator的幫助類的一個基本實現(xiàn)。當(dāng)AbstractAccountAuthenticator需要一個Activity來讓用戶輸入一些數(shù)據(jù)的時候,可以新建一個指向某個Activity的Intent,并把傳進(jìn)來

4、的AccountAuthenticatorResponse 參數(shù)以 KEY_ACCOUNT_MANAGER_RESPONSE 為鍵放在Intent對象中,也可以把啟動Activity的相關(guān)參數(shù)亦放入Intent對象中,再把Intent對象封裝到Bundle中,并返回該Bundle。15.1 賬戶管理相關(guān)類4AccountManager和AccountManagerService簡介AccountManager是一個面向應(yīng)用程序開發(fā)的組件。它提供一組對應(yīng)于IAccountManager協(xié)議的應(yīng)用程序接口。這組接口通過Binder機(jī)制與系統(tǒng)服務(wù)AccountManagerService進(jìn)行通信,協(xié)

5、作完成帳戶相關(guān)的操作。AccountManagerService是Android的系統(tǒng)服務(wù)。它實現(xiàn)了接口IAccountManager定義的這一組行為。這些行為的實現(xiàn)依賴應(yīng)用程序中定義的Authenticator。應(yīng)用程序開發(fā)者并不直接請求AccountManagerService服務(wù)。賬戶管理相關(guān)的處理,由AccountManager提供接口。15.1 賬戶管理相關(guān)類可以按如下的方式獲得AccountManager實例: AccountManager accountManager = AccountManager.get(context);實際上get()方法中,調(diào)用了Context.get

6、SystemService()來創(chuàng)建實例:public static AccountManager get(Context context) if (context = null) throw new IllegalArgumentException(context is null); return (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);15.1 賬戶管理相關(guān)類Account Manager允許你獲取存儲在用戶設(shè)備上的賬戶信息。Android設(shè)備可以根據(jù)許多不同的提供者來存儲多個不同類型的賬戶。當(dāng)為

7、了某個賬戶名而使用AcccountManager進(jìn)行查詢的時候,可以選擇使用Account Type來filter。賬戶類型是一個唯一標(biāo)識已經(jīng)發(fā)布賬戶的String。例如,Google賬戶使用“com.google”,Twitter使用“com.twitter.android.auth.login”。為了獲得在設(shè)備上所有的賬戶列表,App需要有GET_ACCOUNTS權(quán)限,可使用標(biāo)簽在manifest文件中來添加請求權(quán)限。 一旦決定需要查詢哪些賬戶了,可以像下面的例子一樣來獲得一個Account的數(shù)組,里面均是與類型符合的賬戶信息。/ this references the current C

8、ontext AccountManager am = AccountManager.get(this); Account accounts = am.getAccountsByType(com.google); 15.1 賬戶管理相關(guān)類5AbstractThreadedSyncAdapter簡介android.content.AbstractThreadedSyncAdapter是一個抽象類,它主要用于執(zhí)行Account相關(guān)內(nèi)容(比如Contact)的同步操作。它是對Account的內(nèi)容(比如contact)進(jìn)行同步操作的適配器。AbstractThreadedSyncAdapter收到同步請

9、求后,將產(chǎn)生一個線程來進(jìn)行Account指定內(nèi)容的同步處理。15.2 使用OAuth2來進(jìn)行身份鑒定1簡介為了安全的訪問線上服務(wù),用戶需要在service上進(jìn)行鑒定,他們需要提供身份的證明。對于一個程序來說,如果是訪問第三方的服務(wù),那么這個安全問題就更加復(fù)雜。目前行業(yè)內(nèi)解決這種第三方服務(wù)身份鑒定的方法是使用OAuth2協(xié)議。OAuth2提供了auth token,它代表用戶身份與用戶對于程序的授權(quán)。前言首要問題 信息安全第三方登錄-OAUTH協(xié)議OAUTH協(xié)議:為用戶資源的授權(quán)提供了一個安全的、開放而又簡易的標(biāo)準(zhǔn),OAUTH的授權(quán)不會使第三方觸及到用戶的帳號信息(如用戶名與密碼)。第三方無需使

10、用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權(quán),因此OAUTH是安全的。第三方登錄-OAUTH協(xié)議英文名 : OAuth本 質(zhì) :一種開放的協(xié)議對 象 :第三方可以使用OAUTH認(rèn)證服務(wù)歷史事件:OAuth開始于2006年11月, Twitter的OpenID實現(xiàn)。2007年4月,成立了OAuth討論組。OAuth Core 1.0 版本發(fā)布于2007年12月4日2009年6月24日發(fā)布了OAuth Core 1.0 Revision A 版本。OAuth 2.0的草案是在2010年5月初在IETF發(fā)布的。OAuth 2.0是OAuth協(xié)議的下一版本,但不向后兼容OAuth 1.0。第三方

11、登錄-三方描述在認(rèn)證和授權(quán)的過程中涉及的三方包括:服務(wù)提供方,用戶使用服務(wù)提供方來存儲受保護(hù)的資源,如照片,視頻,聯(lián)系人列表。用戶 ,存放在服務(wù)提供方的受保護(hù)的資源的擁有者。客戶端 ,要訪問服務(wù)提供方資源的第三方應(yīng)用。在認(rèn)證過程之前,客戶端要向服務(wù)提供者申請客戶端標(biāo)識。協(xié)議特點和原理協(xié)議特點(1). 簡單:不管是OAUTH服務(wù)提供者還是應(yīng)用開發(fā)者,都很易于理解與使用;(2). 安全:沒有涉及到用戶密鑰等信息,更安全更靈活;(3). 開放:任何服務(wù)提供商都可以實現(xiàn)OAUTH,任何軟件開發(fā)商都可以使用OAUTH;OAUTH1.0-認(rèn)證流程第一步:用戶訪問第三方網(wǎng)站,比如:需要使用QQ進(jìn)行登錄的網(wǎng)站

12、;第二步:你點擊QQ登錄后,第三方網(wǎng)站將會連接并進(jìn)行請求,比如:點擊登錄后,第三方網(wǎng)站會跳轉(zhuǎn)到QQ平臺,提示用戶進(jìn)行登錄;第三步:用戶進(jìn)行授權(quán)第三方網(wǎng)站對該用戶的信息訪問的一個權(quán)限,比如:當(dāng)QQ登錄成功后,QQ會提示是否授權(quán)第三方Web訪問用戶基本信息或其他的資源信息,這時用戶可以選擇點擊授權(quán)即可;第四步:授權(quán)后,第三方Web即可訪問剛才授權(quán)的資源信息,比如:QQ基本信息-頭像、昵稱、性別等。1、oauth1.0對手機(jī)客戶端,移動設(shè)備等非server第三方的支持不好。是因為oauth1.0將多種流程合并成了一種,而事實證明,這種合并的流程體驗性非常差。2、oauth1.0的三步認(rèn)證過程比較繁瑣

13、和復(fù)雜,對第三方開發(fā)者增加了極大的開發(fā)難度。3、oauth1.0的加密需求過于復(fù)雜,第三方開發(fā)者使用oauth之前需要花費精力先實現(xiàn)oauth1.0的加密算法。4、oauth1.0生成的access_token要求是永久有效的,這導(dǎo)致的問題是網(wǎng)站的安全性和破壞網(wǎng)站的架構(gòu)。1.0缺陷15.2 使用OAuth2來進(jìn)行鑒定使用OAuth2有利于:(1)從用戶那得到授權(quán),使用賬戶信息來訪問online service;(2)對online service進(jìn)行鑒定,保護(hù)用戶利益;(3)處理認(rèn)證錯誤。Facebook的新的Graph API只支持OAuth2,Google在2011年3月亦宣布Google

14、 API對OAuth 2.0的支持。OAuth在認(rèn)證和授權(quán)的過程中涉及的三方包括:(1)服務(wù)提供方:用戶使用服務(wù)提供方來存儲受保護(hù)的資源,如照片,視頻,聯(lián)系人列表。(2)用戶:存放在服務(wù)提供方的受保護(hù)的資源的擁有者。(3)客戶端,要訪問服務(wù)提供方資源的第三方應(yīng)用,通常是網(wǎng)站,如提供照片打印服務(wù)的網(wǎng)站。在 認(rèn)證過程之前,客戶端要向服務(wù)提供者申請客戶端標(biāo)識。15.2 使用OAuth2來進(jìn)行鑒定使用OAuth進(jìn)行認(rèn)證和授權(quán)的過程如下所示:(1)用戶想操作存放在服務(wù)提供方的資源;(2)用戶登錄客戶端向服務(wù)提供方請求一個臨時令牌;(3)服務(wù)提供方驗證客戶端的身份后,授予一個臨時令牌;(4)客戶端獲得臨時

15、令牌后,將用戶引導(dǎo)至服務(wù)提供方的授權(quán)頁面請求用戶授權(quán);在這個過程中,將臨時令牌和客戶端的回調(diào)連接發(fā)送給服務(wù)提供方;(5)用戶在服務(wù)提供方的網(wǎng)頁上輸入用戶名和密碼,然后授權(quán)該客戶端訪問所請求的資源;(6)授權(quán)成功后,服務(wù)提供方引導(dǎo)用戶返回客戶端的網(wǎng)頁;(7)客戶端根據(jù)臨時令牌從服務(wù)提供方那里獲取訪問令牌;(8)服務(wù)提供方根據(jù)臨時令牌和用戶的授權(quán)情況授予客戶端訪問令牌;(9)客戶端使用獲取的訪問令牌訪問存放在服務(wù)提供方上的受保護(hù)的資源。OAUTH2.0-認(rèn)證流程15.2 使用OAuth2來進(jìn)行鑒定2收集信息在開始使用OAuth2之前,你需要獲取到下面一些信息:(1)你想訪問的服務(wù)地址。(2)aut

16、h scope。App獲取到用來表示操作的權(quán)限范圍的字串。例如,Google Tasks的read-only的auth scope是 “View your tasks”, 但是read-write的auth scope是 “Manage Your Tasks”。(3)client id與client secret。用來表示身份的字串。你需要直接從Service提供者那邊獲取那些字串。/apis/tasks/articles/oauth-and-tasks-on-android.html解釋了如何使用Google Tasks API來獲取那些需要的字串。15.2 使用OAuth2來進(jìn)行鑒定3請求

17、一個授權(quán)口令為了獲取到auth token,首先需要在manifest文件中增加ACCOUNT_MANAGER與INTERNET的權(quán)限。 15.2 使用OAuth2來進(jìn)行鑒定一旦設(shè)置好了上面的permissions,就可以使用AccountManager.getAuthToken() 來獲取到token。值得注意的是:AccountManager里對Account的操作可能包括了網(wǎng)絡(luò)通信,大多數(shù)方法是asynchronous,這意味著不應(yīng)該把所有的auth操作放在一個方法里面,需要使用callback機(jī)制來實現(xiàn)它。例如:AccountManager am = AccountManager.ge

18、t(this); Bundle options = new Bundle(); am.getAuthToken( myAccount_, / Account retrieved using getAccountsByType() Manage your tasks, / Auth scope options, / Authenticator-specific options this, / Your activity new OnTokenAcquired(), / Callback called when a token is successfully acquired new Handle

19、r(new OnError(); / Callback called if an error occurs 15.2 使用OAuth2來進(jìn)行鑒定在上面的例子中,OnTokenAcquired是AccountManagerCallback的子類。在OnTokenAcquired類里面AccountManager會執(zhí)行run(AccountManagerFuture arg0)方法。如果獲取成功,那么token就在Bundle里面。下面是如何從Bundle中獲取token的示例:private class OnTokenAcquired implements AccountManagerCallb

20、ack Override public void run(AccountManagerFuture result) / Get the result of the operation from the AccountManagerFuture. Bundle bundle = result.getResult(); / The token is a named value in the bundle. The name of the value / is stored in the constant AccountManager.KEY_AUTHTOKEN. token = bundle.ge

21、tString(AccountManager.KEY_AUTHTOKEN); . 如果一切正常,那么Bundle里面會包含KEY_AUTHTOKEN的字段,但是通常事情沒有那么順利。15.2 使用OAuth2來進(jìn)行鑒定4再次請求Auth Token你的第一次有可能由于下面的某個原因而導(dǎo)致失?。?(1)設(shè)備上的某個錯誤或者是網(wǎng)絡(luò)錯誤導(dǎo)致AccountManager操作失敗;(2)用戶不授權(quán)你的App訪問Account;(3)存儲的Account證書信息不足以讓你訪問Account;(4)在Cache里面的auth token已經(jīng)過期。程序能簡單地處理前兩種情況,通常僅僅是顯示一個錯誤信息給用戶。

22、如果網(wǎng)絡(luò)異常或者用戶不授權(quán),程序就沒有必要接下去操作了。對于后面兩種情況稍微有點復(fù)雜,通常對于好的程序都應(yīng)該自動處理那些錯誤。第三種情況,沒有足夠的證書,這些證書是通過前面提到的回調(diào)函數(shù)返回在Bundle里面,是一個使用KEY_INTENT關(guān)鍵字的Intent。這是獲取token的前提。 15.2 使用OAuth2來進(jìn)行鑒定之所以鑒定者返回一個Intent是有很多原因的。也許是用戶的Account過期或者他們存儲的證書出錯,這個時候可以使用Intent來讓用戶重新登入。也許Account需要兩個證書,或者他需要激活Camera來做某個掃描的動作進(jìn)而驗證。不管到底是因為什么,如果想要一個有效的t

23、oken,你需要啟動Intent來獲取token。private class OnTokenAcquired implements AccountManagerCallback Override public void run(AccountManagerFuture result) . Intent launch = (Intent) result.get(AccountManager.KEY_INTENT); if (launch != null) startActivityForResult(launch, 0); return; 15.2 使用OAuth2來進(jìn)行鑒定請注意例子中使用的是

24、startActivityForResult(),這樣我們可以在自己的Activity里面通過實現(xiàn)onActivityResult()的方法來獲取返回的結(jié)果。這是非常重要的,如果你沒有獲取返回的結(jié)果,那么就無法區(qū)分出用戶是否成功獲得了鑒定。如果result是RRSULT_OK,然后認(rèn)證者就會更新存儲的證書,這樣就可以獲取到足夠的證書,你也可以再次執(zhí)行AccountManage.getAuthToken()方法來請求新的token。最后一種情況,token過期,實際上這不是AccountManager的錯誤。唯一判斷token是否過期的方法是把token告訴Server,通過Server來告知已

25、經(jīng)過期,但是不斷地去線上檢查是否過期明顯是比較浪費資源的。15.2 使用OAuth2來進(jìn)行鑒定5連接到Online Service下面的例子顯示了如何連接到Google server。因為Google使用了行業(yè)標(biāo)準(zhǔn)的OAuth2協(xié)議,所以這個例子很具有代表性。請記住,盡管每一個Server是不一樣的,你仍然可以對特殊的情形進(jìn)行調(diào)整。Google APIs需要你為每個請求提供4個值,分別是API key、client ID、client secret與auth key。前面三個可以從Google API的網(wǎng)站上找到,最后一個字段需要你通過執(zhí)行AccountManager.getAuthToken

26、()方法來獲取。當(dāng)都拿到之后,通過HTTP request來傳遞那些值給Google Server。15.2 使用OAuth2來進(jìn)行鑒定URL url = new URL(/tasks/v1/users/me/lists?key=+your_api_key); URLConnection conn = (HttpURLConnection) url.openConnection(); conn.addRequestProperty(client_id, your client id); conn.addRequestProperty(client_secret, your client sec

27、ret); conn.setRequestProperty(Authorization, OAuth + token); 如果上面的請求返回HTTP錯誤代碼401,表明你的token被否定了。在最后一部分我們有提到,最通常的錯誤原因是token過期了,解決這個問題的方法很簡單,執(zhí)行AccountManager.invalidateAuthToken()方法并且在需要的時候重復(fù)執(zhí)行token的請求操作。因為token過期是如此的常見,并且修復(fù)它是那么的簡單,許多程序甚至在獲取token之前就假定它是過期的,如果Server重新生成一個token的花費并不大,我們可以直接剛開始就執(zhí)行Account

28、Manager.invalidateAuthToken(),這樣就省得剛開始需要請求兩次。15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中(不講)獲取系統(tǒng)中注冊的帳號類型列表是一個典型的用例。比如,在手機(jī)“設(shè)置”界面中選擇“添加帳戶”,這時系統(tǒng)顯示一個所有支持的帳戶類型的列表界面(ChooseAccountActivity)供用戶點選。另外,在Contacts/Calendar等應(yīng)用程序中,也會向系統(tǒng)請求創(chuàng)建帳戶或者顯示帳戶列表。背后的操作是統(tǒng)一由Android Framework提供的。應(yīng)用程序只要將設(shè)置好的Intent發(fā)送出去即可。1實現(xiàn)自定義的賬戶密鑰首先需要做的是從用戶那獲取證書(輸入賬戶

29、與密碼后進(jìn)行驗證),這個過程也許只是簡單的顯示一個對話框來輸入用戶名與密碼,或者是比較復(fù)雜的操作來獲取證書。需要實現(xiàn)下面的操作: (1)從用戶那收集賬戶與密碼;(2)連接到Server進(jìn)行驗證;(3)把獲得的證書存儲到設(shè)備上。15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中上面三個請求通常能夠在一個Activity上實現(xiàn),我們把這個Acitivity稱為Authenticator Activity。因為需要與AccountManager系統(tǒng)進(jìn)行交互,Authenticator Activity需要比通常的Activity多做一些特定的請求。為了使得這個過程簡單化,Android Framework

30、提供了一個AccountAuthenticatorActivity來給用戶進(jìn)行擴(kuò)展并創(chuàng)建自定義的Authenticator。前面兩個操作,需要用戶輸入信息并進(jìn)行驗證,第三個步驟通常像下面一樣。final Account account = new Account(mUsername, your_account_type); mAccountManager.addAccountExplicitly(account, mPassword, null); 15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中2注意安全性需要注意的是,AccountManager里面的賬戶信息是沒有加密的,它僅僅是使用plai

31、n text的方式(明文方式)來存儲那些賬戶信息。在大多數(shù)設(shè)備上,情況不是特別嚴(yán)重,因為它存儲那些信息在數(shù)據(jù)庫中,而這些數(shù)據(jù)只能是有ROOT權(quán)限的才能訪問。但是在已經(jīng)有ROOT權(quán)限的設(shè)備上,證書信息可以通過adb來被任何人進(jìn)行訪問。(一般來說,不應(yīng)該使用AccountManager.addAccountExplicitly()方法來傳遞真實的密碼,而是使用暗文加密的方式來存儲賬戶信息。)15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中3繼承AbstractAccountAuthenticatorAbstractAccountAuthenticator的內(nèi)部類Transport是IAccountAu

32、thenticator接口的一個實現(xiàn)。后者規(guī)定了Authenticator的一組行為。以添加帳號的操作為例,作為接口實現(xiàn)的Transport的addAccount()方法調(diào)用了AbstractAccountAuthenticator類的addAccount()抽象方法,這個方法的具體實現(xiàn),則由應(yīng)用程序中定義的Authenticator子類來完成。所以我們還需要創(chuàng)建一個Authenticator類去繼承AbstractAccountAuthenticator,并且實現(xiàn)它的抽象方法。具體有:(1)需要重寫AbstractAccountAuthenticator的7個抽象方法。(2)需要為“andr

33、oid.accounts.AccountAuthenticator”在Manifest.xml文件中增加一個intent filiter。(3)需要有兩套資源文件,自定義的賬戶名與圖標(biāo)。如果查閱Android Sample中自帶的SampleSyncAdapter代碼,會發(fā)現(xiàn)示例中類Authenticator的addAccount方法返回的是帶有Bundle的Intent。這個Intent是用來啟動你自定義的AuthenticationActivity的。如果AuthenticationActivity需要任何特定初始化的參數(shù),可以使用intent.putExtra()方法來附帶參數(shù)。15.3

34、 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中4創(chuàng)建一個AuthenticationServiceAuthenticator需要在多個程序中可用,并且在后臺程序中運行。因此它需要在運行在一個Service里面。我們稱這個Authenticator Service,它需要具備以下設(shè)定:(1)持有一個Authenticator實例;(2)onBind()方法返回Authenticator對應(yīng)的IBinder;(3)包含Authenticator的XML描述文件; (4)Manifest.xml中對應(yīng)的Service聲明中包含處理“android.accounts.AccountAuthenticator”的

35、intent filter,以及指向Authenticator描述文件的標(biāo)記。15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中5AccountManager的addAccount()簡要工作流程在程序中創(chuàng)建指定類型的系統(tǒng)帳號,需要提供一個ccountManagerCallback類型的回調(diào),后面會講到其作用。本方法要求用戶添加指定類型的帳號。此種帳號類型對應(yīng)的Authenticator將加載對應(yīng)的UI來處理這個請求。方法返回一個AccountManagerFuture對象,可解析出一個Bundle,包含以下信息:KEY_ACCOUNT_NAME:創(chuàng)建的帳號的名稱。KEY_ACCOUNT_TYPE:

36、帳號類型。15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中AccountManager.addAccount()具體過程如下:(1)AccountManager初始化一個匿名的AmsTask子類實例。AmsTask是AccountManager的內(nèi)部類。private abstract class AmsTask extends FutureTask implements AccountManagerFuture final IAccountManagerResponse mResponse; final Handler mHandler; final AccountManagerCallback

37、 mCallback; final Activity mActivity; public AmsTask(Activity activity, Handler handler, AccountManagerCallback callback) mHandler = handler; mCallback = callback; mActivity = activity; mResponse = new Response(); .15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中它是一個FutureTask子類,執(zhí)行異步的任務(wù),并返回結(jié)果。addAccount()中的匿名子類實現(xiàn)了AmsTask.doW

38、ork()方法: public AccountManagerFuture addAccount(final String accountType, final String authTokenType, final String requiredFeatures, final Bundle addAccountOptions, final Activity activity, AccountManagerCallback callback, Handler handler) . return new AmsTask(activity, handler, callback) public voi

39、d doWork() throws RemoteException mService.addAcount(mResponse, accountType, authTokenType, requiredFeatures, activity != null, optionsIn); .start(); 在doWork()方法的實現(xiàn)中,調(diào)用AccountManager持有的AccountManagerService的代理對象(mService)向AccountManagerService發(fā)起IPC(進(jìn)程通信)。15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中(2)AccountManger調(diào)用AmsTa

40、sk匿名子類的start()方法啟動任務(wù)。(3)start()方法會調(diào)用本類的doWork()方法,在這里就是執(zhí)行AccountManagerService的addAccount()操作。(4)在AccountManagerService的addAccount()這個方法中,創(chuàng)建一個Session類型的匿名實例,并調(diào)用其bind()方法,最終捆綁到應(yīng)用程序提供的AuthenticationService。15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中(5)根據(jù)FutureTask的實現(xiàn)機(jī)制,在任務(wù)執(zhí)行的結(jié)束時期,會調(diào)用本類的done()方法。AmsTask類覆蓋了這個方法: protected

41、void done() if (mCallback != null) postToHandler(mHandler, mCallback, this); 這里的實現(xiàn)調(diào)用了AccountManager.postHandler()方法??疵志涂梢圆碌?,這里將mCallback回調(diào)對象里面的run()方法傳送給主線程的handler進(jìn)行調(diào)用: private void postToHandler(Handler handler, final AccountManagerCallback callback, final AccountManagerFuture future) handler = h

42、andler = null ? mMainHandler : handler; handler.post(new Runnable() public void run() callback.run(future); ); 15.3 應(yīng)用程序如何將一個帳號注冊到系統(tǒng)中在這一次調(diào)用中,三個參數(shù)的來源分別是:(1)handler:mHandler,即當(dāng)前應(yīng)用的主線程。(2)callback:這個由調(diào)用AccountManager的應(yīng)用程序提供。(3)future:this,即當(dāng)前AmsTask實例,它實現(xiàn)了AccountManagerCallback接口,包含的是跨進(jìn)程執(zhí)行添加帳號操作的返回結(jié)果,是

43、一個Bundle對象。Bundle對象或者包含一個Intent實例,表明帳號創(chuàng)建需要啟動其指定的Activity來與用戶交互,用戶將提供驗證信息,如用戶名、密碼。Bundler對象或者包含已經(jīng)創(chuàng)建的帳號的名稱和類型。而應(yīng)用程序?qū)⒏鶕?jù)這個Bundle里面封裝的實際內(nèi)容采取下一步行動。這樣,在AccountManager的范圍內(nèi),帳號創(chuàng)建的過程就執(zhí)行完畢了。(需要注意的是,這里涉及到IPC,應(yīng)用程序是服務(wù)端,提供服務(wù)的實現(xiàn),而AccountManagerService則是客戶端,負(fù)責(zé)通過代理對象發(fā)起調(diào)用。)15.4 創(chuàng)建自定義賬戶示例(不講)1創(chuàng)建工程palmsuda_demo1我們在Eclips

44、e ADT中創(chuàng)建Android項目:palmsuda_demo1工程。詳見教學(xué)資源光盤code文件夾下第15章palmsuda_demo1工程。palmsuda_demo1工程(源碼)目錄結(jié)構(gòu)和運行界面如圖15-1和圖15-2所示。圖15-1 palmsuda_demo1工程(源碼)目錄 圖15-2 添加自定義賬戶運行效果:當(dāng)我們單擊手機(jī)“設(shè)置”中的“添加賬戶”時,便會在如上圖所示的“添加賬戶”界面,看到在Android系統(tǒng)賬戶中添加了palmsuda_demo1工程的賬戶圖標(biāo)和賬戶名稱“掌上蘇大_1”。單擊“掌上蘇大_1”,則彈出“自定義賬戶Demo”界面,允許我們填入個人信息,并提交遠(yuǎn)程服

45、務(wù)器進(jìn)行驗證,并返回token,同時存入個人賬戶信息。15.4 創(chuàng)建自定義賬戶示例2代碼實現(xiàn)(1)Authenticator.java主要代碼如下:public class Authenticator extends AbstractAccountAuthenticator private static final String TAG = Authenticator;private final Context mContext;Overridepublic Bundle addAccount(AccountAuthenticatorResponse response,String accou

46、ntType, String authTokenType,String requiredFeatures, Bundle options)throws NetworkErrorException final Intent intent = new Intent(mContext, NPersoncenterAvtivity.class);intent.putExtra(NPersoncenterAvtivity.PARAM_AUTHTOKEN_TYPE,authTokenType);intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR

47、_RESPONSE,response);final Bundle bundle = new Bundle();bundle.putParcelable(AccountManager.KEY_INTENT, intent);return bundle;15.4 創(chuàng)建自定義賬戶示例(2)AuthenticationService .java主要代碼如下:public class AuthenticationService extends Service private static final String TAG = AuthenticationService; private Authenti

48、cator mAuthenticator; Override public void onCreate() mAuthenticator = new Authenticator(this); Override public IBinder onBind(Intent intent) return mAuthenticator.getIBinder(); 15.4 創(chuàng)建自定義賬戶示例(3)在Manifest.xml中對Service進(jìn)行配置: (4)此外,/palmsuda_demo1/res/xml文件夾下還有authenticator.xml和account_preferences.xml。

49、而作為用戶輸入個人信息界面的是NPersoncenterAvtivity.java。詳見教學(xué)資源光盤code文件夾下第15章palmsuda_demo1工程。第三方授權(quán)登錄微博、QQ、微信、支付寶等第三方登錄第三方支付QQ開放平臺微博登錄介紹(一)微博登錄包括身份認(rèn)證、用戶關(guān)系以及內(nèi)容傳播。允許用戶使用微博帳號登錄訪問第三方網(wǎng)站,分享內(nèi)容,同步信息。它有如下特點:直接用微博賬號登錄你的網(wǎng)站獲得高質(zhì)量微博活躍用戶更便捷的分享到微博,提高網(wǎng)站信息傳播力。新浪開放平臺網(wǎng)站接入(為網(wǎng)站帶來流量,社交關(guān)系和流量)移動應(yīng)用(手機(jī)客戶端)站內(nèi)應(yīng)用(微盤)網(wǎng)站接入微博登錄介紹-網(wǎng)站接入(二)系統(tǒng)分配作為應(yīng)用憑證自己填寫,作為登陸地址和應(yīng)用簡介提供各種語言實現(xiàn)的SDK第三方登錄-認(rèn)證步驟OAUTHWeb應(yīng)用的認(rèn)證授權(quán)(/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E)code 用來換取accesstoken的授權(quán)碼請求獲取Grant Code

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論