6

Używam nowego Google Drive Android API i mogę się połączyć i zrobić all that it will allow me to do, ale aby móc korzystać z usługi SpreadsheetService, muszę wyodrębnić nazwę accountName/e-mail od zalogowanego użytkownika .Pobierz nazwę konta/e-mail z Dysku Google Android API

Jak to zrobić?

Oto kod, pod którym łączę interfejs API Dysku Google. To działa dobrze.

private void connect() { 

    if (isGooglePlayServicesAvailable()) { 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addApi(Drive.API) 
        .addScope(Drive.SCOPE_FILE) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .build(); 
     } 
     // And, connect! 

     if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.connect(); 
      writeLog("Connecting..."); 
     } 

    } 
} 

Oto gdzie używam API SpreadsheetService, ale muszę nazwę konta, aby uzyskać tokenu.

String accountName = "???"; // how do I get this From GoogleClientApi/mGoogleApiClient ? 
String accessToken = GoogleAuthUtil.getTokenWithNotification(GDriveActivity.this, accountName, scope, null); 
SpreadsheetService service = new SpreadsheetService("v1"); 

Próbowałem to dodając w ten sposób:

String accountName = Plus.AccountApi.getAccountName(mGoogleApiClient); 

... w metodzie onConnected, ale rzuca NullPointerException.

Również tutaj są moje uprawnienia:

<uses-permission 
    android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission 
    android:name="android.permission.VIBRATE" /> 
<uses-permission 
    android:name="android.permission.INTERNET" /> 
<uses-permission 
    android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission 
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission 
    android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission 
    android:name="android.permission.NETWORK" /> 
<uses-permission 
    android:name="android.permission.USE_CREDENTIALS" /> 
+0

prosimy nadać jej czytania https: // programiści .google.com/+/mobile/android/people – Raghuram

Odpowiedz

5

Mam teraz powrócił do dołu, która pozwala mi dostać się na konto w dowolnym momencie.

Kiedy zadałem to pytanie, miałem wrażenie, że mogłem je zdobyć tylko wtedy, gdy początkowo się łączyłem. Oczywiście nie miałem racji.

private String getAccountName() { 

    String accountName = null; 

    AccountManager manager = (AccountManager) getSystemService(ACCOUNT_SERVICE); 
    Account[] list = manager.getAccounts(); 
    for (Account account : list) { 
     if (account.type.equalsIgnoreCase("com.google")) { 
      accountName = account.name; 
      break; 
     } 
    } 
    return accountName; 
} 

Oczywiście, w tym poniższym zgody w AndroidManifest:

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
+0

Co zrobić, jeśli masz wiele kont Google? Następnie automatycznie wybieramy pierwszy. – Roel

+1

Zgadzam się z Roel, co jeśli masz wiele kont? Jest to jedyny temat, który znalazłem w odniesieniu do tego samego problemu, z którym się borykam. Potrzebuję adresu e-mail zalogowanego użytkownika Dysku Google. Czy mamy już prawdziwe rozwiązanie? –

+0

@ LucasEduardo czy znalazłeś rozwiązanie? – osayilgan

13

trzeba dodać:

    .addApi(Plus.API) 

przy budowie klienta. Wtedy to będzie działać w onConnected(Bundle):

String accountName = Plus.AccountApi.getAccountName(mGoogleApiClient); 

zakładając już masz poprawne uprawnienia (które robią):

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
+0

Tak, działa ... –

+5

Czy to możliwe bez interfejsu API Plus? Używasz tylko com.google.android.gms: play-services-identity? – Roel

+0

Plus jest teraz przestarzałe. – Jaydev

0

można dostać różne dane z Plus.PeopleApi

protected static GoogleApiClient mGoogleApiClient; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(Plus.API).addScope(Plus.SCOPE_PLUS_LOGIN) 
      .addApi(Games.API).addScope(Games.SCOPE_GAMES) 
      .build(); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    String data = Plus.API.getName() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getName() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getId() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getAboutMe() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getBirthday() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getBraggingRights() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getCurrentLocation() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getNickname() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getDisplayName() + "\n" + 
      Plus.PeopleApi.getCurrentPerson(mGoogleApiClient).getTagline(); 
    Toast.makeText(this, data, Toast.LENGTH_LONG).show(); 
+1

Plus jest przestarzałe – Jaydev

Powiązane problemy