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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

6、SystemService()來(lái)創(chuàng)建實(shí)例: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允許你獲取存儲(chǔ)在用戶設(shè)備上的賬戶信息。Android設(shè)備可以根據(jù)許多不同的提供者來(lái)存儲(chǔ)多個(gè)不同類型的賬戶。當(dāng)為

7、了某個(gè)賬戶名而使用AcccountManager進(jìn)行查詢的時(shí)候,可以選擇使用Account Type來(lái)filter。賬戶類型是一個(gè)唯一標(biāo)識(shí)已經(jīng)發(fā)布賬戶的String。例如,Google賬戶使用“com.google”,Twitter使用“com.twitter.android.auth.login”。為了獲得在設(shè)備上所有的賬戶列表,App需要有GET_ACCOUNTS權(quán)限,可使用標(biāo)簽在manifest文件中來(lái)添加請(qǐng)求權(quán)限。 一旦決定需要查詢哪些賬戶了,可以像下面的例子一樣來(lái)獲得一個(gè)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簡(jiǎn)介android.content.AbstractThreadedSyncAdapter是一個(gè)抽象類,它主要用于執(zhí)行Account相關(guān)內(nèi)容(比如Contact)的同步操作。它是對(duì)Account的內(nèi)容(比如contact)進(jìn)行同步操作的適配器。AbstractThreadedSyncAdapter收到同步請(qǐng)

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

10、用用戶的用戶名與密碼就可以申請(qǐng)獲得該用戶資源的授權(quán),因此OAUTH是安全的。第三方登錄-OAUTH協(xié)議英文名 : OAuth本 質(zhì) :一種開(kāi)放的協(xié)議對(duì) 象 :第三方可以使用OAUTH認(rèn)證服務(wù)歷史事件:OAuth開(kāi)始于2006年11月, Twitter的OpenID實(shí)現(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)的過(guò)程中涉及的三方包括:服務(wù)提供方,用戶使用服務(wù)提供方來(lái)存儲(chǔ)受保護(hù)的資源,如照片,視頻,聯(lián)系人列表。用戶 ,存放在服務(wù)提供方的受保護(hù)的資源的擁有者??蛻舳?,要訪問(wèn)服務(wù)提供方資源的第三方應(yīng)用。在認(rèn)證過(guò)程之前,客戶端要向服務(wù)提供者申請(qǐng)客戶端標(biāo)識(shí)。協(xié)議特點(diǎn)和原理協(xié)議特點(diǎn)(1). 簡(jiǎn)單:不管是OAUTH服務(wù)提供者還是應(yīng)用開(kāi)發(fā)者,都很易于理解與使用;(2). 安全:沒(méi)有涉及到用戶密鑰等信息,更安全更靈活;(3). 開(kāi)放:任何服務(wù)提供商都可以實(shí)現(xiàn)OAUTH,任何軟件開(kāi)發(fā)商都可以使用OAUTH;OAUTH1.0-認(rèn)證流程第一步:用戶訪問(wèn)第三方網(wǎng)站,比如:需要使用QQ進(jìn)行登錄的網(wǎng)站

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

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

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

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

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

17、一個(gè)授權(quán)口令為了獲取到auth token,首先需要在manifest文件中增加ACCOUNT_MANAGER與INTERNET的權(quán)限。 15.2 使用OAuth2來(lái)進(jìn)行鑒定一旦設(shè)置好了上面的permissions,就可以使用AccountManager.getAuthToken() 來(lái)獲取到token。值得注意的是:AccountManager里對(duì)Account的操作可能包括了網(wǎng)絡(luò)通信,大多數(shù)方法是asynchronous,這意味著不應(yīng)該把所有的auth操作放在一個(gè)方法里面,需要使用callback機(jī)制來(lái)實(shí)現(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來(lái)進(jìn)行鑒定在上面的例子中,OnTokenAcquired是AccountManagerCallback的子類。在OnTokenAcquired類里面AccountManager會(huì)執(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里面會(huì)包含KEY_AUTHTOKEN的字段,但是通常事情沒(méi)有那么順利。15.2 使用OAuth2來(lái)進(jìn)行鑒定4再次請(qǐng)求Auth Token你的第一次有可能由于下面的某個(gè)原因而導(dǎo)致失?。?(1)設(shè)備上的某個(gè)錯(cuò)誤或者是網(wǎng)絡(luò)錯(cuò)誤導(dǎo)致AccountManager操作失?。唬?)用戶不授權(quán)你的App訪問(wèn)Account;(3)存儲(chǔ)的Account證書(shū)信息不足以讓你訪問(wèn)Account;(4)在Cache里面的auth token已經(jīng)過(guò)期。程序能簡(jiǎn)單地處理前兩種情況,通常僅僅是顯示一個(gè)錯(cuò)誤信息給用戶。

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

23、oken,你需要啟動(dòng)Intent來(lái)獲取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來(lái)進(jìn)行鑒定請(qǐng)注意例子中使用的是

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

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

26、()方法來(lái)獲取。當(dāng)都拿到之后,通過(guò)HTTP request來(lái)傳遞那些值給Google Server。15.2 使用OAuth2來(lái)進(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); 如果上面的請(qǐng)求返回HTTP錯(cuò)誤代碼401,表明你的token被否定了。在最后一部分我們有提到,最通常的錯(cuò)誤原因是token過(guò)期了,解決這個(gè)問(wèn)題的方法很簡(jiǎn)單,執(zhí)行AccountManager.invalidateAuthToken()方法并且在需要的時(shí)候重復(fù)執(zhí)行token的請(qǐng)求操作。因?yàn)閠oken過(guò)期是如此的常見(jiàn),并且修復(fù)它是那么的簡(jiǎn)單,許多程序甚至在獲取token之前就假定它是過(guò)期的,如果Server重新生成一個(gè)token的花費(fèi)并不大,我們可以直接剛開(kāi)始就執(zhí)行Account

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

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

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

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

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

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

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

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

36、帳號(hào)類型。15.3 應(yīng)用程序如何將一個(gè)帳號(hào)注冊(cè)到系統(tǒng)中AccountManager.addAccount()具體過(guò)程如下:(1)AccountManager初始化一個(gè)匿名的AmsTask子類實(shí)例。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)用程序如何將一個(gè)帳號(hào)注冊(cè)到系統(tǒng)中它是一個(gè)FutureTask子類,執(zhí)行異步的任務(wù),并返回結(jié)果。addAccount()中的匿名子類實(shí)現(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()方法的實(shí)現(xiàn)中,調(diào)用AccountManager持有的AccountManagerService的代理對(duì)象(mService)向AccountManagerService發(fā)起IPC(進(jìn)程通信)。15.3 應(yīng)用程序如何將一個(gè)帳號(hào)注冊(cè)到系統(tǒng)中(2)AccountManger調(diào)用AmsTa

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

41、void done() if (mCallback != null) postToHandler(mHandler, mCallback, this); 這里的實(shí)現(xiàn)調(diào)用了AccountManager.postHandler()方法??疵志涂梢圆碌?,這里將mCallback回調(diào)對(duì)象里面的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)用程序如何將一個(gè)帳號(hào)注冊(cè)到系統(tǒng)中在這一次調(diào)用中,三個(gè)參數(shù)的來(lái)源分別是:(1)handler:mHandler,即當(dāng)前應(yīng)用的主線程。(2)callback:這個(gè)由調(diào)用AccountManager的應(yīng)用程序提供。(3)future:this,即當(dāng)前AmsTask實(shí)例,它實(shí)現(xiàn)了AccountManagerCallback接口,包含的是跨進(jìn)程執(zhí)行添加帳號(hào)操作的返回結(jié)果,是

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

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

45、務(wù)器進(jìn)行驗(yàn)證,并返回token,同時(shí)存入個(gè)人賬戶信息。15.4 創(chuàng)建自定義賬戶示例2代碼實(shí)現(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中對(duì)Service進(jìn)行配置: (4)此外,/palmsuda_demo1/res/xml文件夾下還有authenticator.xml和account_preferences.xml。

49、而作為用戶輸入個(gè)人信息界面的是NPersoncenterAvtivity.java。詳見(jiàn)教學(xué)資源光盤(pán)code文件夾下第15章palmsuda_demo1工程。第三方授權(quán)登錄微博、QQ、微信、支付寶等第三方登錄第三方支付QQ開(kāi)放平臺(tái)微博登錄介紹(一)微博登錄包括身份認(rèn)證、用戶關(guān)系以及內(nèi)容傳播。允許用戶使用微博帳號(hào)登錄訪問(wèn)第三方網(wǎng)站,分享內(nèi)容,同步信息。它有如下特點(diǎn):直接用微博賬號(hào)登錄你的網(wǎng)站獲得高質(zhì)量微博活躍用戶更便捷的分享到微博,提高網(wǎng)站信息傳播力。新浪開(kāi)放平臺(tái)網(wǎng)站接入(為網(wǎng)站帶來(lái)流量,社交關(guān)系和流量)移動(dòng)應(yīng)用(手機(jī)客戶端)站內(nèi)應(yīng)用(微盤(pán))網(wǎng)站接入微博登錄介紹-網(wǎng)站接入(二)系統(tǒng)分配作為應(yīng)用憑證自己填寫(xiě),作為登陸地址和應(yīng)用簡(jiǎn)介提供各種語(yǔ)言實(shí)現(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 用來(lái)?yè)Q取accesstoken的授權(quán)碼請(qǐng)求獲取Grant Code

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論