ClassNotFoundException для SignInConfiguration при входе в Google
я внедряю Google login в приложение. Сам логин, кажется, работает нормально, но в тот момент, когда я запрашиваю электронную почту пользователя или маркер ID, я вижу следующую трассировку стека в журнале и статус от GoogleSignInResult as Status{statusCode=unknown status code: 12500, resolution=null}
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'
зарегистрированное исключение, похоже, происходит от другой процесс. Я даже пытался instanciate com.google.android.gms.auth.api.signin.internal.SignInConfiguration моя деятельность, чтобы быть уверенным, что у меня класс работает.
это происходит в сборке отладки, которая не использует proguard.
2 ответов
Я думаю, это может быть отвлекающий маневр. У меня была точно такая же трассировка стека и я потратил массу времени, пытаясь определить причину. Я столкнулся с подобным сообщением во время исследования, которое указало, что это может быть единственным исключением Samsung, которое можно игнорировать (они проверяют намерения в пути или что-то еще). Конечно же, я попробовал устройство HTCOne, и исключение больше не появлялось. У меня все еще были те же общие проблемы с Google Auth, но, по крайней мере, я мог перейти к реальной проблеме, которая (для меня, по крайней мере), похоже, связано с SHA/Cert/Account/Signing. В любом случае-надеюсь, это поможет (что-то проверить в любом случае)
Я решил свою проблему, поставив "приложения ключа подписи" для OAuth 2.0 Client ID SHA - 1 отпечатков пальцев вместо подписанного ключа, который был создан с помощью keytool. Если вы проверили "Google Play App Signing" в консоли Google Play, обычный подписанный ключ не будет работать. Проверьте ключ подписи приложения в консоли Google Play>подпись приложения>сертификат подписи приложения, а затем скопируйте отпечаток сертификата SHA-1 и вставьте его в идентификатор клиента Google API console OAuth 2.0. Он работал для меня!