在使用Google登录后,在应用内获得生日

时间:2018-01-12 08:17:52

标签: android google-play-services google-signin

我按照官方文件与Google实施唱歌。这并不难,但官方文件停止获取名称或电子邮件等基本信息。我需要过生日。

所以,在创建选项时,我添加了这个:

max_threads

由于官方文件在那里停止,我无法得到如何过生日。所以我搜索了网络,发现了一个使用普通HTTP GET请求.requestScopes(Scope("https://www.googleapis.com/auth/user.birthday.read")) 的方法。 (或者这是否由Google Play服务API覆盖?)

但该方法需要访问令牌,该签名未包含在登录后返回的https://people.googleapis.com/v1/people/me中。有一个示例通过创建OAuth服务器ID获取访问ID,然后使用{{1获取访问令牌,但这很复杂,并且它不是在服务器上完成的,它是在应用程序内完成的,就在唱歌之后。

在这种情况下,我是否必须创建OAuth服务器ID,并使用访问令牌来获取生日?

1 个答案:

答案 0 :(得分:1)

经过大量的Google搜索后,我找到了this example。在找到这个之前,我找到了一个使用Plus.API的例子,但是这个答案说它已被弃用了。有趣的是,现在即使这个答案已经过时而且不起作用。我不得不搜索更多来修复它。如果只有Google的登录文档页面包含获取默认字段以外的其他数据的示例,则可以避免所有这些错误。

无论如何,这是适合我的代码。

First, sign in with Google according to the official documentation.
Then,

val HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
val JSON_FACTORY = JacksonFactory.getDefaultInstance();

inner class DamnTask(var email:String) :AsyncTask<Unit,Unit,Unit>()
{
    override fun doInBackground(vararg params: Unit?)
    {
        var credential = GoogleAccountCredential.usingOAuth2(context,
                Collections.singletonList(Scopes.PROFILE));
        credential.selectedAccount = Account(email, "com.google");

        var service = People.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName("MyApp")
                .build();

        var me = service.people().get("people/me")
                .setRequestMaskIncludeField("person.Birthdays")
                .execute();
        Log.d("damn", "Birthday " +me.birthdays.toString());
    }
}

为了使它工作,我不得不将以下库添加到依赖项中。

compile 'com.google.api-client:google-api-client:1.23.0'
compile 'com.google.api-client:google-api-client-android:1.22.0'
compile 'com.google.apis:google-api-services-people:v1-rev4-1.22.0'

另外,我必须在项目的设置中启用“People”API。这需要在Google的Web控制台中完成。我忘记了URL,但如果您不启用它,则异常消息将显示启用它的确切URL。

您可以找到更多字段名称here