6

Con i servizi di riproduzione 8.4, il metodo getCurrentPerson è obsoleto e stavo utilizzando PeopleApi per ottenere il nome, il cognome e il sesso dell'utente.Plus.PeopleApi.getCurrentPerson deprecato in Play services 8.4. Come ottenere il nome, il cognome e il sesso dell'utente utilizzando GoogleSignInApi?

Qualcuno può dirmi come ottenere le informazioni dell'utente connesso con un altro metodo?

+0

Hai provato a utilizzare [GoogleSignInResult] (https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInResult)? – gerardnimo

+0

L'unico oggetto che contiene dati sull'utente in GoogleSignInResult è GoogleSignInAccount che non contiene i dati di cui ho bisogno. –

+0

Ho trovato questo vecchio [thread] (http://stackoverflow.com/questions/2108537/which-google-api-to-use-for-getting-users-first-name-last-name-picture-etc). Spero che questo ti possa aiutare. – gerardnimo

risposta

9

Google Sign-In API può già fornire nome/ultimo/nome visualizzato, e-mail e URL immagine profilo.Se avete bisogno di altre informazioni del profilo, come genere, utilizzare in combinazione con il nuovo 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' 

Quindi scrivere sign-in codice,

// 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 

Quando si maneggia di accesso risultato:

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(); 
} 

Utilizza People Api per recuperare informazioni dettagliate sulla persona.

/** 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(); 
} 

Date un'occhiata a JavaDoc per vedere quali altre informazioni profilo si può ottenere.

10

Aggiornamento: Verificare la risposta di Isabella. Questa risposta usa cose deprecate.

Ho trovato la soluzione da solo così la sto postando qui se qualcun altro ha lo stesso problema.

Sebbene stavo cercando una soluzione per l'utilizzo di GoogleSignInApi per ottenere le informazioni dell'utente, non sono riuscito a trovarlo e penso che sia necessario utilizzare Plus Api per ottenere informazioni come il genere.

@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 è stato dichiarato obsoleto. Vedere le note sulla deprecazione di seguito: https://developers.google.com/+/mobile/android/api-deprecation. Se desideri ottenere informazioni sul profilo diverse da nome/ultimo/nome visualizzato, email e URL immagine profilo (che è già fornito da GoogleSignInAccount), utilizza la nuova API People REST. Vedi esempio di codice nella mia risposta qui sotto. Grazie! –

+0

@IsabellaChen Grazie per il collegamento, l'immagine del profilo (URL) restituita in GoogleSignInAccount è molto piccola. C'è un modo per ottenere un'immagine più grande? Non voglio mostrare un'immagine sfocata dell'utente sulla mia interfaccia utente. –

+1

Purtroppo, nessun approccio raccomandato in questo momento. 96 * 96 foto è servita in questo momento. La maggior parte delle app visualizza semplicemente una miniatura e questa dimensione è sufficiente per loro. Se guardi un URL della foto del profilo, vedrai che termina con "s96-c/photo.jpg", che in questo momento significa 96 * 96. Ma nessuna garanzia che lo schema non cambierà in futuro. Quindi non consiglio di cambiare l'url da solo. –

2

Ciao ho trovato un modo alternativo per l'ultimo login Google Plus, utilizzare il seguente metodo:

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); 
} 

E su risultato attività uso il codice di seguito:

@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()); 
       } 
      }); 
     } 
    } 
} 

Infine il tuo onClick saranno:

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 

     case R.id.txtGooglePlus: 
      latestGooglePlus(); 
      break; 

     default: 
      break; 
    } 
} 
1

solo per aggiungere alla risposta di Hardy sopra, che mi ha guidato nella giusta direzione.

Ho finito per utilizzare due chiamate a GoogleApiClient perché non riuscivo a ottenere ciò che Hardy ha sopra per funzionare.

La mia prima chiamata è al 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); 

Ciò allora dammi la prima parte attraverso l'onActivityResult, lo stesso di Hardy. Tuttavia allora io uso la chiamata al GoogleApiClient.Builder nuovo

mGoogleApiClientPlus = new GoogleApiClient.Builder(getActivity()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(Plus.API) 
      .addScope(Plus.SCOPE_PLUS_PROFILE) 
      .build(); 

mGoogleApiClientPlus.connect(); 

Ora posso accedere alla Plus.PeopleApi tramite il callback 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); 
     } 
    }); 

} 

Con disconnette appropriate e revoca.

È possibile notare che il mio codice utilizza gli stessi callback, che devo riordinare, ma il principal è lì.

2

La prima cosa da fare è seguire l'orientamento di google allo Add Google Sign-In to Your Android App.

allora dovete cambiare le GoogleSignInOptions a:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(getString(R.string.default_web_client_id)) 
      .requestProfile() 
      .requestEmail() 
      .build(); 

Se è necessario aggiungere altri ambiti si può fare in questo modo:

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(); 

E al 'onActivityResult' dentro 'se (result.isSuccess()) {' inserire questo:

new requestUserInfoAsync(this /* Context */, acct).execute(); 

e creare questo metodo:

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); 
    } 
} 

Usando questo è possibile utilizzare i metodi all'interno 'persona meProfile' per ottenere altre informazioni, ma è possibile solo l'ottenere le informazioni pubblica dell'utente altrimenti sarà nullo.

Problemi correlati