2016-03-30 10 views
9

Wprowadzam login Google do aplikacji. Samo logowanie wydaje się działać dobrze, ale chwila mogę zażądać albo użytkownika e-mail lub identyfikator tokena widzę następujące ślad stosu w dzienniku i status z GoogleSignInResult jako Status{statusCode=unknown status code: 12500, resolution=null}Wyjątek ClassNotFoundException dla SignInConfiguration po zalogowaniu się do 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 

Jest to kod I "Za pomocą próbuję zalogować użytkownika:

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

} 

Co robię źle?

Używam następujący Gradle zależność:

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

Zalogowany Wyjątkiem wydaje się pochodzić z innego procesu. Próbowałem nawet zainicjować moją aktywność, aby mieć pewność, że klasa jest dostępna.

Dzieje się to na kompilacji debugowania, która nie korzysta z proguard.

+0

możliwy duplikat http://stackoverflow.com/questions/33583326/new-google-sign-in-android – abielita

+0

@abielita: Dziękuję za porady na temat tego pytania. Będę dążyć do odpowiedzi i zobaczę, czy oni też mi pomogą. :) –

Odpowiedz

5

Myślę, że to może być czerwony-śledzia. Miałem dokładnie ten sam ślad stosu i spędziłem mnóstwo czasu próbując ustalić przyczynę. Natknąłem się na podobne stanowisko podczas badania, które wskazywało na to, że może to być tylko wyjątek od Samsunga, który można zignorować (sprawdzają zamiary tranzytowe lub coś w tym rodzaju). Rzeczywiście, próbowałem na urządzeniu HTCOne i wyjątek już się nie pojawił. Nadal miałem takie same ogólne problemy z Google Auth, ale przynajmniej mogłem przejść do prawdziwego problemu, który (przynajmniej dla mnie) wydaje się być związany z SHA/Cert/Account/Signing. W każdym razie - mam nadzieję, że to pomaga (coś do sprawdzenia na tak)

+0

Tak, wygląda na to, że masz rację. To było rzeczywiście na urządzeniu Samsung i używałem niepoprawnego identyfikatora klienta serwera. Dziękuję Ci. :) –

+1

dzięki za punkt SHA/Cert/Account/Podpisanie – Killer

+0

Dziękuję bardzo, kocham Cię – Jenix

2

mi rozwiązać mój problem, umieszczając "App signing Key" do OAuth 2.0 Client ID SHA-1 palec drukowania zamiast podpisanego klucza, który został wygenerowany za pomocą keytool. Jeśli zaznaczyłeś "Google Play App Signing" w Konsoli Google Play, zwykle podpisany klucz nie będzie działać. Sprawdź klucz podpisywania aplikacji w konsoli Google Play> Podpisywanie aplikacji> Certyfikat podpisywania aplikacji, a następnie skopiuj odcisk cyfrowy certyfikatu SHA-1 i wklej go do identyfikatora klienta OAuth 2.0 w konsoli interfejsu API Google. To zadziałało dla mnie!

Powiązane problemy