有些时候我们需要获取当前手机上绑定的谷歌账户名,也就是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 文章写得通俗易懂,文档质量也很好,有图有代码有源码。
开源中国好像没法上传附件,需要的留邮箱好了:)
获取用户Gmail账户