2016-03-30 4 views
9

Ich implementiere Google Login für eine App. Die Login selbst scheint in Ordnung zu arbeiten, aber der Moment, bitte ich entweder der E-Mail oder ID-Token des Benutzers sieht ich den folgenden Stack-Trace in dem Protokoll und den Status von GoogleSignInResult als Status{statusCode=unknown status code: 12500, resolution=null}ClassNotFoundException für SignInConfiguration bei der Anmeldung mit Google

03-30 13:59:09.821 3634-4322/? E/Parcel: Class not found when unmarshalling: com.google.android.gms.auth.api.signin.internal.SignInConfiguration 
             java.lang.ClassNotFoundException: com.google.android.gms.auth.api.signin.internal.SignInConfiguration 
              at java.lang.Class.classForName(Native Method) 
              at java.lang.Class.forName(Class.java:309) 
              at java.lang.Class.forName(Class.java:273) 
              at android.os.Parcel.readParcelableCreator(Parcel.java:2281) 
              at android.os.Parcel.readParcelable(Parcel.java:2245) 
              at android.os.Parcel.readValue(Parcel.java:2152) 
              at android.os.Parcel.readArrayMapInternal(Parcel.java:2485) 
              at android.os.BaseBundle.unparcel(BaseBundle.java:221) 
              at android.os.BaseBundle.getString(BaseBundle.java:918) 
              at android.content.Intent.getStringExtra(Intent.java:5767) 
              at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:2365) 
              at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1848) 
              at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5809) 
              at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5593) 
              at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:142) 
              at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3786) 
              at android.os.Binder.execTransact(Binder.java:461) 
              Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.auth.api.signin.internal.SignInConfiguration" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]] 
              at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
              at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
              at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
              at java.lang.Class.classForName(Native Method)  
              at java.lang.Class.forName(Class.java:309)  
              at java.lang.Class.forName(Class.java:273)  
              at android.os.Parcel.readParcelableCreator(Parcel.java:2281)  
              at android.os.Parcel.readParcelable(Parcel.java:2245)  
              at android.os.Parcel.readValue(Parcel.java:2152)  
              at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)  
              at android.os.BaseBundle.unparcel(BaseBundle.java:221)  
              at android.os.BaseBundle.getString(BaseBundle.java:918)  
              at android.content.Intent.getStringExtra(Intent.java:5767)  
              at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:2365)  
              at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1848)  
              at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5809)  
              at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5593)  
              at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:142)  
              at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3786)  
              at android.os.Binder.execTransact(Binder.java:461)  
              Suppressed: java.lang.ClassNotFoundException: com.google.android.gms.auth.api.signin.internal.SignInConfiguration 
              at java.lang.Class.classForName(Native Method) 
              at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 
              at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 
              at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 
                ... 18 more 
              Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available 

Dies ist der Code, den ich verwende zum Versuch den Benutzer einzuloggen:

public class SignInActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { 

    private final static String TAG = SignInActivity.class.getSimpleName(); 

    protected final static int REQUEST_CODE_GOOGLE_LOGIN = 1; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sign_in); 

     GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
//    .requestEmail() // Causes ClassNotFoundException for SignInConfiguration 
//    .requestIdToken(getString(R.string.google_server_client_id)) // Causes ClassNotFoundException for SignInConfiguration 
       .build(); 
     final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this, this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions) 
       .build(); 

     SignInButton signInButton = (SignInButton) findViewById(R.id.signInButton); 
     signInButton.setScopes(googleSignInOptions.getScopeArray()); 
     signInButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); 
       startActivityForResult(signInIntent, REQUEST_CODE_GOOGLE_LOGIN); 
      } 
     }); 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == REQUEST_CODE_GOOGLE_LOGIN) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      handleGoogleSignInResult(result); 
     } 
    } 

    protected void handleGoogleSignInResult(GoogleSignInResult googleSignInResult) { 
     Logging.debug(TAG, "handleGoogleSignInResult(" + googleSignInResult + ")"); 
     if (googleSignInResult.isSuccess()) { 
      GoogleSignInAccount googleSignInAccount = googleSignInResult.getSignInAccount(); 
      final String idToken = googleSignInAccount.getIdToken(); 
      if (idToken != null) { 
       Toast.makeText(SignInActivity.this, "Successfully logged in.", Toast.LENGTH_SHORT).show(); 
       // Do fun stuff here 
      } else { 
       Log.e(TAG, "ID token was null. Unable to sign in user."); 
      } 
     } else { 
      Log.e(TAG, "Failed to sign in with Google. Status:" + googleSignInResult.getStatus()); 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     Log.e(TAG, "onConnectionFailed(" + connectionResult + ")"); 
    } 

} 

Was mache ich falsch?

Ich verwende die folgende gradle Abhängigkeit:

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

Die protokollierte Ausnahme von einem anderen Prozess zu kommen scheint. Ich habe sogar versucht, com.google.android.gms.auth.api.signin.internal.SignInConfiguration meine Aktivität zu instanziieren, um sicherzustellen, dass ich die Klasse zugänglich habe.

Dies geschieht auf der Debug-Build, die Proguard nicht verwendet.

+0

möglich duplikat von http://stackoverflow.com/questions/33583326/new-google-sign-in-android – abielita

+0

@abielita: Vielen Dank für die Tipps zu dieser Frage. Ich werde die Antworten verfolgen und sehen, ob sie mir auch helfen. :) –

Antwort

5

Ich denke, das könnte ein Red-Hering sein. Ich hatte genau die gleiche Stack-Spur und habe eine Menge Zeit damit verbracht, die Ursache zu ermitteln. Bei der Recherche stieß ich auf einen ähnlichen Beitrag, der darauf hinwies, dass es sich um eine Ausnahme von Samsung handeln könnte, die ignoriert werden könnte (indem sie Absichten während des Transports oder ähnliches inspiziert). Sicher genug, ich habe versucht, ein HTCOne-Gerät und die Ausnahme nicht mehr angezeigt. Ich hatte immer noch die gleichen allgemeinen Google-Auth-Probleme, aber zumindest konnte ich zu dem wirklichen Problem übergehen, das (zumindest für mich) SHA/Cert/Account/Signing-bezogen zu sein scheint. Wie dem auch sei - hoffen, dass diese (etwas ohnehin überprüfen auf) hilft

+0

Ja, es scheint als hättest du recht. Dies war tatsächlich auf einem Samsung-Gerät, und ich habe eine falsche Server-Client-ID verwendet. Vielen Dank. :) –

+1

danke für den Punkt SHA/Cert/Account/Signing – Killer

+0

Vielen Dank, ich liebe dich – Jenix

2

ich mein Problem gelöst, indem "App signing Key" zu OAuth 2.0-Client-ID SHA-1 Fingerabdruck statt signierten Schlüssel setzen, die unter Verwendung keytool generiert wurde. Wenn Sie die Google Play App-Signierung in der Google Play-Konsole aktiviert haben, funktioniert der übliche signierte Schlüssel nicht. Sieh dir den App-Signaturschlüssel in der Google Play-Konsole> App-Signierung> App-Signaturzertifikat an und kopiere dann den SHA-1-Zertifikatfingerabdruck und füge ihn in die OAuth 2.0-Client-ID der Google-API-Konsole ein. Es hat für mich funktioniert!

Verwandte Themen