Подтвердить что ты не робот

ClassNotFoundException для SignInConfiguration при входе в Google

Я использую Google для входа в приложение. Сам вход в систему, похоже, работает нормально, но в тот момент, когда я запрашиваю токен электронной почты пользователя или идентификатор, я вижу следующую трассировку стека в журнале и состояние от GoogleSignInResult как 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'

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

У меня тоже такая же проблема! попробуйте обновить ключ Project SHA1 в вашей учетной записи Firebase. Он работал для меня. :)

Ответ 4

Я исправил эту проблему следующим образом: я удалил свой проект из консоли разработчика Google и создал другой с другим именем, а также почти полностью изменил имя пакета: например, из com.example.android.appname к com.y.android.anothername. Затем я сгенерировал подписанный apk с моим предыдущим сертификатом, и подпись Google сработала без этой ошибки.