使用Google登录时SignInConfiguration的ClassNotFoundException [英] ClassNotFoundException for SignInConfiguration when signing in with Google

查看:2242
本文介绍了使用Google登录时SignInConfiguration的ClassNotFoundException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在实施Google登录应用。登录本身似乎工作正常,但是当我请求用户的电子邮件或ID令牌时,我在日志中看到以下堆栈跟踪,并且从 GoogleSignInResult 的状态为状态{statusCode =未知状态代码:12500,resolution = null}

  03-30 13:59:09.821 3634-4322 /? E / Parcel:取消编组时未找到类:com.google.android.gms.auth.api.signin.internal.SignInConfiguration 
java.lang.ClassNotFoundException:com.google.android.gms.auth.api.signin .internal.SignInConfiguration $ b $在java.lang.Class.classForName(本地方法)$ b $在java.lang.Class.forName(Class.java:309)$ b $在java.lang.Class。 forName(Class.java:273)
at android.os.Parcel.readParcelableCreator(Parcel.java:2281)
at android.os.Parcel.readParcelable(Parcel.java:2245)
在android.os.Parcel.readValue(Parcel.java:2152)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
在android.os.BaseBundle.unparcel(BaseBundle.java:221)
在android.os.BaseBundle.getString(BaseBundle.java:918)
在android.content.Intent.getStringExtra(Intent.java :在com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:2365 5767)

在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(活性状况tyManagerNative.java:142)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3786)
at android.os.Binder.execTransact(Binder.java:461)
导致:java.lang.ClassNotFoundException:未在路径中找到类com.google.android.gms.auth.api.signin.internal.SignInConfiguration:DexPathList [[directory。,nativeLibraryDirectories = [ / vendor / lib64,/ system / lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)$ b $ at java.lang.ClassLoader.loadClass(ClassLoader.java:511)$在java.lang.ClassLoader.loadClass中使用b $ b(ClassLoader.java:469)在java.lang.Class.classForName中使用
(本地方法)
在java.lang.Class.forName(Class.java:309)
在java.lang.Class.forName(Class.java:273)
在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.serv er.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:2365)
处com.android.server.am com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1848)
。 ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5809)
在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:5593)
在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3786)
at android.os.Binder.execTransact(Binder.java:461)
Suppressed: java.lang.Cla ssNotFoundException:com.google.android.gms.auth.api.signin.internal.SignInConfiguration $ b在java.lang.Class.classForName(本地方法)b $ b在java.lang.BootClassLoader.findClass(ClassLoader。 java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)$ b $ java.util.ClassLoader.loadClass(ClassLoader.java:504)
... 18更多
导致:java.lang.NoClassDefFoundError:未找到使用引导类加载器的类;没有可用的堆栈

这是我用来尝试登录用户的代码:

  public class SignInActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {

private final String TAG = SignInActivity.class。 getSimpleName();

保护最终静态诠释REQUEST_CODE_GOOGLE_LOGIN = 1;

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);

GoogleSignInOptions googleSignInOptions =新GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
// .requestEmail()//导致的ClassNotFoundException为SignInConfiguration
// .requestIdToken(的getString(R.string .google_server_client_id))//导致SignInConfiguration的ClassNotFoundException
.build();
最终GoogleApiClient googleApiClient =新GoogleApiClient.Builder(本)
.enableAutoManage(这一点,这一点)
.addApi(Auth.GOOGLE_SIGN_IN_API,googleSignInOptions)
.build();

SignInButton signInButton =(SignInButton)findViewById(R.id.signInButton);
signInButton.setScopes(googleSignInOptions.getScopeArray());
signInButton.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
意向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);
handlebaseSignInResult(result);



保护无效句柄GoogleSignInResult(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,成功登录,Toast.LENGTH_SHORT).show();
//在这里做有趣的东西
}其他{
Log.e(标签,ID标记为空,无法登录用户。 (标记,无法使用Google登录。状态:+ googleSignInResult.getStatus());

} else {
Log.e


$ b @Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult){
Log.e(TAG,onConnectionFailed(+ connectionResult +));
}

}

我做错了什么?



我使用下面的gradle依赖:

  compile'c​​om .google.android.gms:play-services-auth:8.4.0'

记录异常似乎来自另一个过程。我甚至试图实例化 com.google.android.gms.auth.api.signin.internal.SignInConfiguration 我的Activity来确保我可以访问该类。 / p>

这种情况发生在不使用proguard的调试版本上。

解决方案

我认为这可能是一个红鲱鱼。我有完全相同的堆栈跟踪,并花了大量的时间来确定原因。在研究中,我遇到了类似的帖子,指出这可能是三星唯一可以忽略的例外情况(他们在运输过程中检查意图)。果然,我尝试了HTCOne设备,并且不再出现异常。我仍然有相同的Google Auth问题,但至少我可以转到真正的问题上(至少对我来说)似乎是SHA /证书/帐户/签名相关的问题。无论如何 - 希望这有助于(无论如何要检查)


I'm implementing Google login to an app. The login itself seems to work okay, but the moment I request either the user's e-mail or ID token I see the following stack trace in the log and the status from 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

This is the code I'm using for trying to log in the user:

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

}

What am I doing wrong?

I'm using the following gradle dependency:

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

The logged exception seems to come from another process. I've even tried to instanciate com.google.android.gms.auth.api.signin.internal.SignInConfiguration my Activity to be sure that I have the class accessible.

This is happening on the debug build which doesn't use proguard.

解决方案

I think this might be a red-herring. I had the exact same stack trace and have spent a ton of time trying to determine the cause. I came across a similar post while researching which indicated it might be a Samsung only exception that could be ignore (them inspecting intents in transit or something). Sure enough, I tried on an HTCOne device and the exception no longer appeared. I still had the same overall Google Auth problems, but at least I could move on to the real issue which (for me at least) appears to be SHA/Cert/Account/Signing related. Anyway - hope this helps (something to check on anyway)

这篇关于使用Google登录时SignInConfiguration的ClassNotFoundException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆