6

Playサービス8.4の場合、getCurrentPersonメソッドは廃止され、PeopleApiを使用してユーザーの名、性別、性別を取得していました。Playサービスで廃止されたPlus.PeopleApi.getCurrentPerson 8.4。 GoogleSignInApiを使用してユーザーの名字、性別を取得するにはどうすればよいですか?

ログインしたユーザーの情報を別の方法で取得する方法を教えてもらえますか?

+0

[GoogleSignInResult](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInResult)を使用してみましたか? – gerardnimo

+0

GoogleSignInResultのユーザーに関するデータを含む唯一のオブジェクトは、必要なデータを含んでいないGoogleSignInAccountです。 –

+0

この古い[スレッド](http://stackoverflow.com/questions/2108537/which-google-api-to-use-for-getting-users-first-name-last-name-picture-etc)が見つかりました。これが助けてくれるといいなあ – gerardnimo

答えて

9

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を見てみましょう。

10

更新: 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); 
     } 
    } 
+3

Plus.PeopleApiは推奨されていません。下記の非推奨情報をご覧ください。 https://developers.google.com/+/mobile/android/api-deprecation first/last/display name、email、profile picture url(GoogleSignInAccountから既に提供されている)以外のプロフィール情報を取得する場合は、新しいPeople REST APIを使用してください。私の答えのコードサンプルを参照してください。ありがとう! –

+0

@IsabellaChenリンクをありがとう、GoogleSignInAccountで返されたプロフィール画像(URL)は非常に小さいです。より大きな写真を得る方法はありますか? UIのユーザーのぼやけた画像を表示したくありません。 –

+1

残念ながら、現時点では推奨されていません。 96 * 96の写真が現在配信されています。ほとんどのアプリは単にサムネイルを表示するだけで、このサイズで十分です。あなたがプロフィールの写真のURLを見ると、それは "s96-c/photo.jpg"で終わるのがわかります。この写真は現在96 * 96です。しかし、スキーマが将来変更されないという保証はありません。だから私は自分でURLを変更することはお勧めしません。 –

2

こんにちは、私が見つけた最新の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; 
    } 
} 
1

ただ、正しい方向に私を導い上記ハーディの答えに追加します。

私は、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への呼び出しを使用します。

私のコードでは、整理する必要がある同じコールバックが使用されていますが、プリンシパルはそこにあります。

2

まず、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になりますユーザーの公開情報を取得することができ、これを使用します。

関連する問題