android - 使用 Google 登录时 SignInConfiguration 的 ClassNotFoundException

标签 android google-play-services

我正在对一个应用实现 Google 登录。登录本身似乎工作正常,但当我请求用户的电子邮件或 ID token 时,我在日志中看到以下堆栈跟踪以及 GoogleSignInResult 的状态为 Status{statusCode =未知状态代码: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 我的 Activity 以确保我可以访问该类。

这发生在不使用混淆器的调试版本上。

最佳答案

我认为这可能是转移注意力。我有完全相同的堆栈跟踪,并花了很多时间试图确定原因。我在研究时遇到了一个类似的帖子,表明它可能是三星唯一可以忽略的异常(exception)(他们检查运输中的 Intent 或其他东西)。果不其然,我在一台HTCOne设备上试了一下,异常就不再出现了。我仍然遇到相同的总体 Google Auth 问题,但至少我可以继续解决真正的问题(至少对我而言)似乎与 SHA/Cert/Account/Signing 相关。无论如何 - 希望这会有所帮助(无论如何都要检查一下)

关于android - 使用 Google 登录时 SignInConfiguration 的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309169/

相关文章:

firebase - 如何解决flutter中的gradle googleplayservices版本错误?

java - 如果出现 404 错误则重定向链接

java -\n 不会在 AlertDialog 中生成换行符

java - Android/Java(?) - 从子访问父

android - 无法删除 C++ 中的空文件夹

android - 从服务 : alternate flow of events 使用 Google Play 服务

java - Google Play 游戏服务 - 自定义通知/欢迎回来

java - 加载没有 OutOfMemoryError 的大图像

Android:在路径上找不到类 "com.google.android.gms.ads.AdActivity"

android - 无法解析符号 gcm (Android Studio 0.8.9)