通过Android访问Google账户ID/用户名

79

如何在代码中访问用户的Google帐户ID /用户名? 我正在构建一个调用Web服务存储数据的应用程序,我想识别提交数据的人的身份。


3
获取Google账户的用户名和电子邮件https://dev59.com/5n_aa4cB1Zd3GeqPxwit#31538053 - Mansukh Ahir
在Android中也有一个帐户管理库这里 - Ali Nem
7个回答

47

我遇到了同样的问题,这两个链接解决了我的问题:

第一个链接是这个:如何在Android手机上检索已登录的Google帐户?

它提供了检索与手机相关联的帐户的代码。基本上,您需要类似这样的东西:

AccountManager manager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
Account[] list = manager.getAccounts();

并且要在AndroidManifest.xml文件中添加权限

<uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"></uses-permission>

此外,如果您正在使用模拟器,则以下链接将帮助您使用账户设置其:Android模拟器 - 创建用户账户出现问题

基本上,它说您必须基于API级别创建Android设备,而不是通常所做的SDK版本。


我该如何获取账户头像?非常感谢。 - Urchin
@Urchin 这有点超出了这个问题的范围,但我相信这个链接可能会对你有所帮助。https://dev59.com/9XTYa4cB1Zd3GeqP0_zs - Fabricio Buzeto
1
有点晚了,但如果你正在尝试获取账户头像的话,这可能会对某些人有所帮助(https://dev59.com/imox5IYBdhLWcg3wkk-E)。 - Abdelilah El Aissaoui
在Android中也有一个帐户管理库这里 - Ali Nem

10

获取 Google 用户名的方法:

 public String getUsername() {
    AccountManager manager = AccountManager.get(this);
    Account[] accounts = manager.getAccountsByType("com.google");
    List<String> possibleEmails = new LinkedList<String>();

    for (Account account : accounts) {
        // TODO: Check possibleEmail against an email regex or treat
        // account.name as an email address only for certain account.type
        // values.
        possibleEmails.add(account.name);
    }

    if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) {
        String email = possibleEmails.get(0);
        String[] parts = email.split("@");
        if (parts.length > 0 && parts[0] != null)
            return parts[0];
        else
            return null;
    } else
        return null;
}

简单调用此方法....

获取Gmail账户中的Google用户ID:

 accounts = AccountManager.get(this).getAccounts();
    Log.e("", "Size: " + accounts.length);
    for (Account account : accounts) {

        String possibleEmail = account.name;
        String type = account.type;

        if (type.equals("com.google")) {
            strGmail = possibleEmail;

            Log.e("", "Emails: " + strGmail);
            break;
        }
    }
在清单文件中添加权限之后;
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

9
为什么需要请求互联网和访问网络状态权限? - Chitrang

6

获取已登录用户的个人资料信息 使用GoogleSignInResult.getSignInAccount方法请求当前已登录用户的个人资料信息。 在登录意图成功后,您可以调用getSignInAccount方法。

GoogleSignInResult result = 
Auth.GoogleSignInApi.getSignInResultFromIntent(data);
GoogleSignInAccount acct = result.getSignInAccount();
String personName = acct.getDisplayName();
String personGivenName = acct.getGivenName();
String personFamilyName = acct.getFamilyName();
String personEmail = acct.getEmail();
String personId = acct.getId();
Uri personPhoto = acct.getPhotoUrl();

2

使用以下代码:

AccountManager manager = AccountManager.get(this);
Account[] accounts = manager.getAccountsByType("com.google");

数组accounts的长度始终为0。


请使用Android 6.0以下的设备-6...(API级别23-...),因为更高版本的设备需要运行时权限,并且它将始终返回长度为0。 - Mandeep Yadav

2
if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
  Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);
  String userid=currentPerson.getId(); //BY THIS CODE YOU CAN GET CURRENT LOGIN USER ID
}

你在使用哪个库?我遇到了 Plus 无法解析符号 的问题。 - Choletski
这基于使用Google+ API,对于大多数开发者来说可能太过陌生。 - GregD

0

这里有一个来自谷歌的示例,它列出了现有的谷歌账户并在选择后生成访问令牌,您可以将该访问令牌发送到服务器以从中检索相关详细信息以识别用户。

您还可以从访问令牌中获取电子邮件地址,但需要修改SCOPE。

请查看我的帖子


-4
String name = android.os.Build.USER;

if (!TextUtils.isEmpty(name)) {
    nameEdit.setText(name);
}

2
好的,我尝试了一下,它返回给我“dpi”。显然不是用户的名字。 - Nandan Sawant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接