Playサービス8.4の場合、getCurrentPersonメソッドは廃止され、PeopleApiを使用してユーザーの名、性別、性別を取得していました。Playサービスで廃止されたPlus.PeopleApi.getCurrentPerson 8.4。 GoogleSignInApiを使用してユーザーの名字、性別を取得するにはどうすればよいですか?
ログインしたユーザーの情報を別の方法で取得する方法を教えてもらえますか?
Playサービス8.4の場合、getCurrentPersonメソッドは廃止され、PeopleApiを使用してユーザーの名、性別、性別を取得していました。Playサービスで廃止されたPlus.PeopleApi.getCurrentPerson 8.4。 GoogleSignInApiを使用してユーザーの名字、性別を取得するにはどうすればよいですか?
ログインしたユーザーの情報を別の方法で取得する方法を教えてもらえますか?
Google Sign-In APIには、最初/最後/表示名、メールアドレス、プロフィール写真のURLが既に記載されています。
GoogleSignInResult result =
Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
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();
}
:あなたは性別のような他のプロファイル情報が必要な場合、それは次にサインインコード、
// Make sure your GoogleSignInOptions request profile & email
GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
// Follow official doc to sign-in.
// https://developers.google.com/identity/sign-in/android/sign-in
サインイン結果の取り扱い書く新しいPeople API
// Add dependencies
compile 'com.google.api-client:google-api-client:1.22.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を使用して詳細な人物情報を取得します。
/** Global instance of the HTTP transport. */
private static HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
// On worker thread
GoogleAccountCredential credential =
GoogleAccountCredential.usingOAuth2(MainActivity.this, Scopes.PROFILE);
credential.setSelectedAccount(new Account(personEmail, "com.google"));
People service = new People.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME /* whatever you like */)
.build();
// All the person details
Person meProfile = service.people().get("people/me").execute();
// e.g. Gender
List<Gender> genders = meProfile.getGenders();
String gender = null;
if (genders != null && genders.size() > 0) {
gender = genders.get(0).getValue();
}
あなたが得ることができ、他のどのようなプロファイル情報を参照するJavaDocを見てみましょう。
更新: Isabellaの答えを確認してください。この回答は廃止予定のものを使用しています。
自分自身で解決策を見つけたので、他の誰かが同じ問題に直面している場合は、ここに投稿しています。
私はGoogleSignInApiを使用してユーザーの情報を取得するためのソリューションを探していましたが、それを見つけることができず、Plus Apiを使用して性別のような情報を取得する必要があると思います。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
HandleSignInResult
private void handleSignInResult(GoogleSignInResult result)
{
Log.d(TAG, "handleSignInResult:" + result.isSuccess());
if (result.isSuccess())
{
GoogleSignInAccount acct = result.getSignInAccount();
Toast.makeText(getApplicationContext(),""+acct.getDisplayName(),Toast.LENGTH_LONG).show();
Plus.PeopleApi.load(mGoogleApiClient, acct.getId()).setResultCallback(new ResultCallback<People.LoadPeopleResult>() {
@Override
public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) {
Person person = loadPeopleResult.getPersonBuffer().get(0);
Log.d(TAG,"Person loaded");
Log.d(TAG,"GivenName "+person.getName().getGivenName());
Log.d(TAG,"FamilyName "+person.getName().getFamilyName());
Log.d(TAG,("DisplayName "+person.getDisplayName()));
Log.d(TAG,"Gender "+person.getGender());
Log.d(TAG,"Url "+person.getUrl());
Log.d(TAG,"CurrentLocation "+person.getCurrentLocation());
Log.d(TAG,"AboutMe "+person.getAboutMe());
Log.d(TAG,"Birthday "+person.getBirthday());
Log.d(TAG,"Image "+person.getImage());
}
});
//mStatusTextView.setText(getString(R.string.signed_in_fmt, acct.getDisplayName()));
//updateUI(true);
} else {
//updateUI(false);
}
}
Plus.PeopleApiは推奨されていません。下記の非推奨情報をご覧ください。 https://developers.google.com/+/mobile/android/api-deprecation first/last/display name、email、profile picture url(GoogleSignInAccountから既に提供されている)以外のプロフィール情報を取得する場合は、新しいPeople REST APIを使用してください。私の答えのコードサンプルを参照してください。ありがとう! –
@IsabellaChenリンクをありがとう、GoogleSignInAccountで返されたプロフィール画像(URL)は非常に小さいです。より大きな写真を得る方法はありますか? UIのユーザーのぼやけた画像を表示したくありません。 –
残念ながら、現時点では推奨されていません。 96 * 96の写真が現在配信されています。ほとんどのアプリは単にサムネイルを表示するだけで、このサイズで十分です。あなたがプロフィールの写真のURLを見ると、それは "s96-c/photo.jpg"で終わるのがわかります。この写真は現在96 * 96です。しかし、スキーマが将来変更されないという保証はありません。だから私は自分でURLを変更することはお勧めしません。 –
こんにちは、私が見つけた最新のGoogleプラスのログインのための別の方法、以下の方法を使用します。
GoogleApiClient mGoogleApiClient;
private void latestGooglePlus() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestProfile().requestEmail().requestScopes(Plus.SCOPE_PLUS_LOGIN, Plus.SCOPE_PLUS_PROFILE, new Scope("https://www.googleapis.com/auth/plus.profile.emails.read"))
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.addApi(Plus.API)
.build();
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, YOURREQUESTCODE);
}
そして活動の結果使用上の以下のコード:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("Activity Res", "" + requestCode);
if (requestCode == YOURREQUESTCODE) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount acct = result.getSignInAccount();
acct.getPhotoUrl();
acct.getId();
Log.e(TAG, acct.getDisplayName());
Log.e(TAG, acct.getEmail());
Plus.PeopleApi.load(mGoogleApiClient, acct.getId()).setResultCallback(new ResultCallback<People.LoadPeopleResult>() {
@Override
public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) {
Person person = loadPeopleResult.getPersonBuffer().get(0);
Log.d(TAG, (person.getName().getGivenName()));
Log.d(TAG, (person.getName().getFamilyName()));
Log.d(TAG, (person.getDisplayName()));
Log.d(TAG, (person.getGender() + ""));
Log.d(TAG, "person.getCover():" + person.getCover().getCoverPhoto().getUrl());
}
});
}
}
}
最後に、あなたのonClickは次のようになります。
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.txtGooglePlus:
latestGooglePlus();
break;
default:
break;
}
}
ただ、正しい方向に私を導い上記ハーディの答えに追加します。
私は、GoogleApiClientへの2回の呼び出しを使用して終了しました。これは、Hardyが上記の機能を果たさなかったためです。
私の最初の呼び出しは、これはその後、onActivityResult、ハーディと同じを通じて私の最初の部分を与えるGoogleSignInApi
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestProfile()
.requestEmail()
.requestIdToken(MY_GOOGLE_SERVER_CLIENT_ID)
.build();
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, ThinQStepsConstants.REQUEST_CODE_GOOGLE_SIGN_IN);
にあります。しかし、その後、私は今、私は適切な接続を切断してonConnectedコールバック
@Override
public void onConnected(Bundle connectionHint) {
Log.i(TAG, "onConnected");
Plus.PeopleApi.load(mGoogleApiClientPlus, mGoogleId).setResultCallback(new ResultCallback<People.LoadPeopleResult>() {
@Override
public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) {
Person currentPerson = loadPeopleResult.getPersonBuffer().get(0);
}
});
}
経由Plus.PeopleApiにアクセスし、取り消しができ
mGoogleApiClientPlus = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_PROFILE)
.build();
mGoogleApiClientPlus.connect();
再びGoogleApiClient.Builderへの呼び出しを使用します。
私のコードでは、整理する必要がある同じコールバックが使用されていますが、プリンシパルはそこにあります。
まず、Add Google Sign-In to Your Android AppでGoogleのオリエンテーションに従ってください。
次にあなたがGoogleSignInOptionsを変更する必要があります場合は(」
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestScopes(new Scope(Scopes.DRIVE_APPFOLDER))
.requestProfile()
.requestEmail()
.build();
そして「onActivityResult」内部で:あなたはこのようにそれを行うことができ、別のスコープを追加する必要がある場合
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestProfile()
.requestEmail()
.build();
result.isSuccess()){」この挿入:
new requestUserInfoAsync(this /* Context */, acct).execute();
を、このメソッドを作成します。
private static class requestUserInfoAsync extends AsyncTask<Void, Void, Void> {
// Global instance of the HTTP transport.
private static HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
// Global instance of the JSON factory.
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private Context context;
private GoogleSignInAccount acct;
private String birthdayText;
private String addressText;
private String cover;
public requestUserInfoAsync(Context context, GoogleSignInAccount acct) {
this.context = context;
this.acct = acct;
}
@Override
protected Void doInBackground(Void... params) {
// On worker thread
GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
context, Collections.singleton(Scopes.PROFILE)
);
credential.setSelectedAccount(new Account(acct.getEmail(), "com.google"));
People service = new People.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(context.getString(R.string.app_name) /* whatever you like */)
.build();
// All the person details
try {
Person meProfile = service.people().get("people/me").execute();
List<Birthday> birthdays = meProfile.getBirthdays();
if (birthdays != null && birthdays.size() > 0) {
Birthday birthday = birthdays.get(0);
// DateFormat.getDateInstance(DateFormat.FULL).format(birthdayDate)
birthdayText = "";
try {
if (birthday.getDate().getYear() != null) {
birthdayText += birthday.getDate().getYear() + " ";
}
birthdayText += birthday.getDate().getMonth() + " " + birthday.getDate().getDay();
} catch (Exception e) {
e.printStackTrace();
}
}
List<Address> addresses = meProfile.getAddresses();
if (addresses != null && addresses.size() > 0) {
Address address = addresses.get(0);
addressText = address.getFormattedValue();
}
List<CoverPhoto> coverPhotos = meProfile.getCoverPhotos();
if (coverPhotos != null && coverPhotos.size() > 0) {
CoverPhoto coverPhoto = coverPhotos.get(0);
cover = coverPhoto.getUrl();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Log.i("TagTag", "birthday: " + birthdayText);
Log.i("TagTag", "address: " + addressText);
Log.i("TagTag", "cover: " + cover);
}
}
あなたが他の情報を取得するために「人meProfile」内部メソッドを使用することができますが、あなただけそれ以外の場合はnullになりますユーザーの公開情報を取得することができ、これを使用します。
[GoogleSignInResult](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInResult)を使用してみましたか? – gerardnimo
GoogleSignInResultのユーザーに関するデータを含む唯一のオブジェクトは、必要なデータを含んでいないGoogleSignInAccountです。 –
この古い[スレッド](http://stackoverflow.com/questions/2108537/which-google-api-to-use-for-getting-users-first-name-last-name-picture-etc)が見つかりました。これが助けてくれるといいなあ – gerardnimo