1. 技術方案
方案一,AccountPicker+GoogleAuthUtil,使用AccountPicker擷取username,使用GoogleAuthUtil擷取assess token。該方法支援單點登入,介面都是SDK裡面繪製好的,優點是方便簡單,缺點是AccountPicker不支4.2.x以下的版本。 方案二,AccountManager+ GoogleAuthUtil,使用AccountManager擷取username。AccountManager的API Level5,該方法的優點是相容性較好,缺點是需要定製一個對話方塊,來提示使用者選擇裝置上已經登入的帳號,或者建立一個帳號。 下面分別介紹這兩種方法。
2. AccountPicker+GoogleAuthUtil API文檔 https://developer.android.com/reference/com/google/android/gms/common/AccountPicker.html
http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html
User-Permission <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.NETWORK" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.INTERNET" />
首先,調用SDK的單點登入頁面。private static final int REQ_CODE_PICK_ACCOUNT = 3333; // 數值可以自己定義哦Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[] { "com.google" }, false, null, null, null, null) startActivityForResult(intent, REQ_CODE_PICK_ACCOUNT); 然後,得到username。protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQ_CODE_PICK_ACCOUNT: if (resultCode == RESULT_OK) { // 擷取user name成功 String name = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); // username } else { // 擷取user name失敗 } break; ... ...} 最後,擷取token。 String token = GoogleAuthUtil.getToken(MainActivity.this, userName, "oauth2:" + scope); // 後台線程中 這一步需要注意的是scope的設定。格式為"oauth2:scope1 scope2 scope3", https://developers.google.com/+/api/oauth 使用"https://www.googleapis.com/auth/plus.login"和"https://www.googleapis.com/auth/userinfo.email",這兩個scope即可。
3. AccountManager+ GoogleAuthUtil
API文檔 http://developer.android.com/reference/android/accounts/AccountManager.html
User-Permission <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.NETWORK" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" /> <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.wise" /> <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.writely" /> 擷取裝置上登入的Google帳號。AccountManager manager = AccountManager.get(this);Account[] accounts = manager.getAccountsByType("com.google"); 登入其他Google帳號或者建立Google帳號,並且擷取該帳號。manager.addAccount("com.google", null, null, null, this, new AccountManagerCallback<Bundle>() { @Override public void run(AccountManagerFuture<Bundle> future) { if (future.isDone()) { try { Bundle bundle = future.getResult(); String name = bundle.getString(AccountManager.KEY_ACCOUNT_NAME); } catch (Exeception e) { e.printStackTrace(); } } }}, null); 一般,先擷取裝置上的帳號,如果裝置上只有一個帳號,那麼直接擷取該帳號的Token;如果裝置上沒有帳號,直接使用manager.addAccount添加帳號,添加成功後,擷取該帳號的Token;如果裝置上有多個帳號,那麼彈出對話方塊,可以選擇多個帳號,也可以建立新的帳號,根據使用者的選擇,做出相應的處理。
4. 驗證擷取的Token是否有效 https://www.googleapis.com/oauth2/v1/userinfo?access_token=擷取的token