標籤:android http java os 2014 io
有些時候我們需要擷取當前手機上綁定的Google賬戶名,也就是Gmail賬戶名,以便標記不同使用者。
現在我發現主要有三種方式擷取gmail賬戶:
1 android 內建API
這種方式最簡單,最容易實現,但是這種方式需要一個GET_ACCOUNTS的使用者權限,在stackoverflow 上說這個許可權是a heavy duty permission. 因為有這個許可權之後,不僅是裝置上的Gmail賬戶,其他賬戶都可以暴露在程式中,而有時我們僅僅只需要gmail賬戶。而據我觀察這個API在裝置同時關聯了兩個Gmail的情況下無法區分哪個是主賬戶。
2 google play service
這種方式避免了上面所提及的許可權問題,但是這種方式也有一個小小的問題,就是他擷取的方式是發起一個Intent,這個Intent會建立一個Dialog,然後讓你選擇一個賬戶,通過這種方式擷取到gmail賬戶
3 google+
這種方式其實是第二種方式的延續,並且還會需要第一種方式的許可權,這種方式的好處是不僅可以擷取使用者Gmail還可以擷取其他如帳戶圖片、google+u上的暱稱等其他資訊。在本文中,這種方式不做重點介紹,只是附帶一個連結,那個連結中已經講的非常詳盡並且還有源碼(我也會附上)。
下面來詳細說明前兩種的實現方式:
1 第一種方式:
public static String getEmail(Context context) { AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccountsByType("com.google");//擷取google賬戶 Account account = accounts.length > 0 ? accounts[0] : null;//取第一個賬戶 return account == null ? null : account.name; }
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
2 第二種方式
這種方式必須要求有google play services的庫,這個庫可以在sdk manager中進行下載,不過鑒於長城的影響,這個很難下載,最好是找一個離線的直接放到android sdk下。主要代碼邏輯如下:
if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext())) { try { Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }, false, null, null, null, null); startActivityForResult(intent, REQUEST_CODE_EMAIL); } catch (ActivityNotFoundException e) { } } } activity result: private static final int REQUEST_CODE_EMAIL = 1; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_EMAIL && resultCode == RESULT_OK) { String gmail = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); } }
3 最後一種方式實現稍複雜:
這裡引用一位印度開發人員的文章:androidhive 文章寫得通俗易懂,文檔品質也很好,有圖有代碼有源碼。
開源中國好像沒法上傳附件,需要的留郵箱好了:)