2016-03-30 7 views
9

Я внедряю логин Google в приложение. Сам Логин, кажется, работает хорошо, но в тот момент я прошу либо по электронной почте или ID маркера пользователя я вижу следующую трассировку стека в журнале и статус от GoogleSignInResult как Status{statusCode=unknown status code: 12500, resolution=null}ClassNotFoundException для SignInConfiguration при входе в систему с помощью 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 

Это код, который я Используется для попытки входа пользователя:

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

} 

Что я делаю неправильно?

Я использую следующий Gradle зависимость:

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

Вошедший исключение, кажется, исходит из другого процесса. Я даже пытался ввести в действие com.google.android.gms.auth.api.signin.internal.SignInConfiguration свою активность, чтобы быть уверенным в доступности класса.

Это происходит на отладочной сборке, которая не использует proguard.

+0

Возможный дубликат http://stackoverflow.com/questions/33583326/new-google-sign-in-android – abielita

+0

@abielita: Спасибо за советы по этому вопросу. Я продолжу ответы и посмотрю, помогут ли они мне. :) –

ответ

5

Я думаю, что это может быть красно-селедка. У меня была точно такая же трассировка стека и потратили много времени, пытаясь определить причину. Я столкнулся с подобным посту, исследуя, что это может быть только исключение Samsung, которое можно игнорировать (они проверяют намерения в пути или что-то в этом роде). Разумеется, я попробовал устройство HTCOne, и исключение больше не появлялось. У меня все еще были те же общие проблемы с Google Auth, но по крайней мере я мог перейти к реальной проблеме, которая (по крайней мере для меня), похоже, связана с SHA/Cert/Account/Signing. Во всяком случае - надеюсь, что это помогает (что-то проверить в любом случае)

+0

Да, похоже, ты прав. Это действительно было на устройстве Samsung, и я использовал неправильный идентификатор клиента сервера. Спасибо. :) –

+1

спасибо за сообщение SHA/Cert/Account/Signing – Killer

+0

Большое вам спасибо Я люблю тебя – Jenix

2

я решил мою проблему, поставив "App signing Key" в OAuth 2.0 Client ID SHA-1 отпечатку пальца вместо подписанного ключа, который был сгенерирован с помощью Keytool. Если вы отметили «Подписать приложение Google Play» в Google Play Console, обычный подписанный ключ не будет работать. Ознакомьтесь с ключом подписи приложения в Google Play Console> Подписание подписки> Подписать сертификат подписки, а затем скопируйте отпечаток сертификата SHA-1 и вставьте в консоль API Google OAuth 2.0 Client ID. Это сработало для меня!