0

Obwohl der Code aus der offiziellen Beispiel-App kopiert wurde, wird der Authentifizierungszustimmungsbildschirm nicht angezeigt, wenn die App über den Play Store veröffentlicht wird. Ich habe zwei OAuth 2.0-Berechtigungsnachweise in Google Api Developer Console generiert, eine für die Veröffentlichung (mit meinem privaten Keystore) und eine für das Debugging (mithilfe des Android Studio-Debug-Keystores).Play-Dienste 11.6: OAuth-Zustimmungsbildschirm wird bei Veröffentlichung nicht angezeigt

UPDATE: Installation meiner App auf einem älteren Emulator 4.4 im Debug-Modus Ich bemerkte das gleiche Verhalten der Release-App auf neueren Geräten. Es wird kein Zustimmungsbildschirm angezeigt, und Logcat zeigt diese Nachricht an:

W/GooglePlayServicesUtil: Google Play-Dienste veraltet. Benötigt 11.717.000 aber 11.509.030 gefunden

es, dass neuere Könnte GoogleApi Schnittstelle den Benutzer aufzufordern, nicht PlayServices zu installieren/aktualisieren, auch wenn die offizielle Dokumentation sagt das?

Hier ist mein Code:

build.gradle (app)

compile 'com.google.android.gms:play-services-auth:11.6.0' 
compile 'com.google.android.gms:play-services-drive:11.6.0' 

AndroidManifest.xml

<meta-data 
    android:name="com.google.android.gms.version" 
    android:value="@integer/google_play_services_version" /> 

DriveActivity.java

private static final int REQUEST_CODE_SIGN_IN = 0; 

protected GoogleSignInClient mGoogleSignInClient; 
protected DriveClient mDriveClient; 
protected DriveResourceClient mDriveResourceClient; 

protected abstract void onDriveConnected(); 

    @Override 
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
      case REQUEST_CODE_SIGN_IN: 
       if (resultCode == RESULT_OK) { 
        Task<GoogleSignInAccount> getAccountTask = GoogleSignIn.getSignedInAccountFromIntent(data); 
        if (getAccountTask.isSuccessful()) { 
         initializeDriveClient(getAccountTask.getResult()); 
        } 
        else { 
         Toast.makeText(this, "Sign-in failed.", Toast.LENGTH_LONG).show(); 
        } 
       } 
       break; 
     } 
    } 

    protected void signIn() { 
     GoogleSignInAccount signInAccount = GoogleSignIn.getLastSignedInAccount(this); 
     if (signInAccount != null && signInAccount.getGrantedScopes().contains(Drive.SCOPE_FILE)) { 
      initializeDriveClient(signInAccount); 
     } 
     else { 
      GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
        .requestScopes(Drive.SCOPE_FILE) 
        .build(); 
      mGoogleSignInClient = GoogleSignIn.getClient(this, signInOptions); 
      startActivityForResult(mGoogleSignInClient.getSignInIntent(), REQUEST_CODE_SIGN_IN); 
     } 
    } 

    private void initializeDriveClient(GoogleSignInAccount signInAccount) { 
     mDriveClient = Drive.getDriveClient(this, signInAccount); 
     mDriveResourceClient = Drive.getDriveResourceClient(this, signInAccount); 
     onDriveConnected(); 
    } 

Antwort

0

ich meine eigene Frage beantworten. Das Problem besteht darin, dass die Google Play-Dienste nicht aktualisiert werden und die aktuelle GoogleApi-Benutzeroberfläche dies nicht überprüft (möglicherweise ein Bug?). Also muss man einen Scheck setzen, bevor die Authentifizierung versucht:

protected void signIn() { 
    if (checkPlayServices()) { 
     ... 
    } 
} 

private boolean checkPlayServices() { 
    GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance(); 
    int result = googleAPI.isGooglePlayServicesAvailable(this); 
    if (result != ConnectionResult.SUCCESS) { 
     if (googleAPI.isUserResolvableError(result)) { 
      googleAPI.getErrorDialog(this, result, PLAY_SERVICES_RESOLUTION_REQUEST).show(); 
     } 
     else { 
      Toast.makeText(this, R.string.message_unsupported_device, Toast.LENGTH_LONG).show(); 
     } 
     return false; 
    } 
    return true; 
} 

Hoffe, dass es jemand anderes hilft!

+0

Wenn Sie eine Aktivität an GoogleSignIn.getClient() übergeben, sollten Sie in einem Dialogfeld zur Aktualisierung der Google Play-Dienste aufgefordert werden. Könnten Sie ein physisches Gerät ausprobieren? Bei Emulatoren ohne Play Store ist das Verhalten etwas anders (d. H. Ein nicht behebbarer Fehler, der nur in Protokollen angezeigt wird). –

+0

Kein Dialog selbst auf dem physischen Gerät, leider ... – Alessandro

+0

Hmm ... das ist nicht zu erwarten. getClient (Aktivität, Optionen) sollte einen Dialog auslösen, wenn die Google Play-Dienste älter als SDK sind. Was Sie für DriveActivity.java eingefügt haben, ist eine direkte Kopie von Ihrem Aktivitätscode? Und dein physisches Gerät hat ältere Play-Dienste als 11.6? –

0

Für andere Personen sollte GoogleSignIn.getClient (this/* activity * /, signInOptions) in der Regel bei Bedarf automatisch nach dem Play-Dienstupdate fragen.

Aber im neuesten 11.6 SDK ist diese Funktion vorübergehend mit targetSdkVersion 26 unterbrochen. Erwägen Sie, GoogleApiAvailability.showErrorDialogFragment() unter diesen Bedingungen zu verwenden, bis es in zukünftigen Versionen behoben wird.

Verwandte Themen