Не удается получить частный день рождения из учетной записи Google Plus, хотя явный запрос

Я пытаюсь получить информацию о пользователе, включая пол и возраст, из своей учетной записи Google Plus. Поскольку эти поля могут быть частными, я думал, что запрос на них явно решит проблему. Однако, хотя в диалоговом окне с надписью явно указано, что приложение запрашивает View your complete date of birth , я не могу получить день рождения.

Это мои области (пробовал много вариантов):

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) //.requestScopes(new Scope(Scopes.PROFILE)) //.requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestScopes(new Scope("https://www.googleapis.com/auth/user.birthday.read"), new Scope("https://www.googleapis.com/auth/userinfo.profile")) //.requestProfile() .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .addScope(new Scope(Scopes.PROFILE)) .build(); 

При использовании устаревшего getCurrentPerson в onActivityResult я получаю нулевое значение:

 if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (mGoogleApiClient.hasConnectedApi(Plus.API)) { Person person = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); if (person != null) { Log.i(TAG, person.getDisplayName()); //returns full name successfully Log.i(TAG, person.getGender()); //0 Log.i(TAG, person.getBirthday()); //null } } } 

Я также попытался получить его из учетной записи ( GoogleSignInAccount account = result.getSignInAccount() ), но, насколько я искал, эта переменная вообще не владеет запрошенными данными.

Я что-то упускаю? Или, может быть, невозможно получить личные данные, хотя явный запрос?

Благодарю.

Кстати, я еще не пробовал сценарий с частным сексом.

Я думаю, что эта документация API Google People будет полезна для вашей проблемы.

Обратите внимание:

Если для запроса требуется авторизация (например, запрос личных данных пользователя), то приложение должно предоставить маркер OAuth 2.0 с запросом. Приложение также может предоставить ключ API, но это не обязательно.

а также

Запросы API People для негосударственных пользовательских данных должны быть авторизованы аутентифицированным пользователем.

  1. Если пользователь одобряет, то Google предоставляет вашему приложению кратковременный токен доступа .
  2. Ваша заявка запрашивает данные пользователя, прикрепляя токен доступа к запросу.
  3. Если Google определяет, что ваш запрос и токен действительны, он возвращает запрашиваемые данные.

Если ваше приложение не имеет токена доступа, вы можете прочитать « Использование OAuth 2.0» для доступа к API Google или попробовать свой ответ по следующему вопросу:

Как получить токен доступа после входа пользователя из Gmail в Android?


ОБНОВЛЕНИЕ: Предположим, что ваше приложение может получить токен доступа, используя пример кода в моем ответе выше, а затем внутри onResponse добавьте дополнительные фрагменты, как onResponse ниже:

 ... @Override public void onResponse(Response response) throws IOException { try { JSONObject jsonObject = new JSONObject(response.body().string()); final String message = jsonObject.toString(5); Log.i("onResponse", message); // FROM HERE... String accessToken = jsonObject.optString("access_token"); OkHttpClient client2 = new OkHttpClient(); final Request request2 = new Request.Builder() .url("https://people.googleapis.com/v1/people/me") .addHeader("Authorization", "Bearer " + accessToken) .build(); client2.newCall(request2).enqueue(new Callback() { @Override public void onFailure(final Request request, final IOException e) { Log.e("onFailure", e.toString()); } @Override public void onResponse(Response response) throws IOException { try { JSONObject jsonObject = new JSONObject(response.body().string()); final String message = jsonObject.toString(5); Log.i("onResponse", message); } catch (JSONException e) { e.printStackTrace(); } } }); } catch (JSONException e) { e.printStackTrace(); } } ... 

Информация Logcat (я усекался с тех пор, как он длинный)

 I/onResponse: { "photos": [ { "url": "https:...photo.jpg", "metadata": { "source": { "id": "1....774", "type": "PROFILE" }, "primary": true } } ], ... "birthdays": [ { "date": { "month": 2, "year": 1980, "day": 2 }, "metadata": { "source": { "id": "1....774", "type": "PROFILE" }, "primary": true } } ], .... } 

GoogleSignInOptions и GoogleApiClient :

 String serverClientId = getString(R.string.server_client_id); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope("https://www.googleapis.com/auth/user.birthday.read")) .requestServerAuthCode(serverClientId) .build(); GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); 

Обратите внимание, что версия OkHttp, которую я использую здесь, – v2.6.0, если ваше приложение использует новейшее (3.3.1), то синтаксис / классы будут разными. Конечно, вы также можете использовать другие, такие как Volley, Retrofit …


Кроме того, этот API-интерфейс People People – метод Google обеспечивает Try It как снимок экрана ниже

Введите описание изображения здесь

Другие полезные ссылки:

Блог разработчиков Google – анонс API для людей

API Google, связанные с API Google People

Авторизация с помощью API для REST API (другой способ получить токен доступа)

Попробуйте эту инициализацию

 GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this).addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_LOGIN).build(); 

Иначе запрашиваемый пользователь должен иметь общедоступную видимость дня рождения.

Intereting Posts
Просто установленные Windows 10 и Eclipse больше не запускаются Я не помню свой пароль для debug.keystore для Android. Java.lang.IllegalStateException: указанный ребенок уже имеет родительский Повтор tileMode с векторным рисунком Как установить процентную ширину для диалогового действия Можем ли мы использовать Intent.EXTRA_ALLOW_MULTIPLE для более старых версий уровней API Android с помощью библиотеки поддержки Android? Есть ли наблюдатели, написанные в RecyclerView.Adapter, чтобы узнать, был ли изменен набор данных? Android Возможно ли иметь несколько SlidingDrawer Уникальный идентификатор для SMS и контактов (для проверки дублирования) в Android Является ли onDestroy () гарантированно вызванным для фрагментов? Как переопределить полноэкранный жест выхода активности? Может ли удаленный прослушиватель ViewTreeObserver вызвать утечку памяти? Могу ли я получить свойства, определенные в «gradle.properties» в JAVA STATEMENT? В любом случае, чтобы аутентифицировать пользователя с помощью Google Apps в приложении для Android? Изменить положение кнопки «Мое местоположение» в Google Maps API