我的应用在Google登录时崩溃

时间:2018-07-31 14:05:27

标签: android firebase runtime-error google-signin runtimeexception

我正在使用Firebase将google登录集成到我的android项目中。遵循this教程之后,我能够获得登录名。但是当我选择帐户时,应用程序崩溃了。

通过我使用Kotlin语言的方式。

代码段如下:

class SignupActivity:AppCompatActivity(){

lateinit var googleSignInClient: GoogleSignInClient
lateinit var gso: GoogleSignInOptions
val RC_SIGN_IN :Int =1
lateinit var signOut:Button
lateinit var mAuth: FirebaseAuth

private var callbackManager: CallbackManager?=null
@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.signup)
    header_signup_button.setOnClickListener {
        startActivity(Intent(this,SplashscreenActivity::class.java))
    }
    gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
    googleSignInClient = GoogleSignIn.getClient(this,gso)
    mAuth = FirebaseAuth.getInstance()
    signOut = findViewById<View>(R.id.signOutBtn) as Button
    signOut.visibility= View.INVISIBLE
    google_signup.setOnClickListener {
        view:View?->signInGoogle()
    }
    signupemail_button.setOnClickListener {
        startActivity(Intent(this,EmailSignupActivity::class.java))
    }

    val fblogin_button= findViewById<Button>(R.id.facebook_signup)
    fblogin_button.setOnClickListener {
        callbackManager = CallbackManager.Factory.create()
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"))
        if (!isloggedIn()) {
            LoginManager.getInstance().registerCallback(callbackManager,
                    object : FacebookCallback<LoginResult> {
                        override fun onSuccess(loginResult: LoginResult) {
                            Log.d("LoginActivity", "Facebook token" + loginResult.accessToken.token)
                            startActivity(Intent(baseContext, MainActivity::class.java))
                        }

                        override fun onCancel() {
                            Log.d("LoginActivity", "Facebook oncancel")
                        }

                        override fun onError(error: FacebookException?) {
                            Log.d("LoginActivity", "Facebook onError")
                        }
                    })
        } else {
            LoginManager.getInstance().unregisterCallback(callbackManager, object : FacebookCallback<LoginResult> {
                override fun onSuccess(result: LoginResult?) {
                    GraphRequest(AccessToken.getCurrentAccessToken(), "/{user-id}/permissions/", null, HttpMethod.DELETE, GraphRequest.Callback() {
                        AccessToken.setCurrentAccessToken(null)
                        LoginManager.getInstance().logOut()
                    }).executeAsync()
                    Log.d("LoginActivity", "Facebook token" + result?.accessToken?.token)
                }

                override fun onCancel() {
                    Log.d("LoginActivityunregister", "Facebook oncancel")
                }

                override fun onError(error: FacebookException?) {
                    Log.d("LoginActivityunregister", "Facebook onError")
                }

            })
        }
    }
}

private fun signInGoogle() {
    val signIntent:Intent =googleSignInClient.signInIntent
    startActivityForResult(signIntent,RC_SIGN_IN)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == RC_SIGN_IN) {
    if (resultCode!= Activity.RESULT_OK) {
            val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data)
        try {
            val account = task.getResult()
            val credential = GoogleAuthProvider.getCredential(account.idToken,null)
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(this, OnCompleteListener<AuthResult>(){
                        if (task.isSuccessful) {
                            val user = mAuth.currentUser
                            if (user != null) {
                                updateUI(user)
                            }
                        }else{
                            updateUI(null)
                        }
                    })
        }catch (e:ApiException){
            Toast.makeText(this,e.toString(),Toast.LENGTH_SHORT).show()
        }

        }
    }
    else {
        callbackManager?.onActivityResult(requestCode, resultCode, data)
    }
}
private fun updateUI(user: FirebaseUser?) {
    val disptext = findViewById<View>(R.id.disptxt) as TextView
    if (user != null) {
        disptext.text = user.displayName
    }
    signOut.visibility=View.VISIBLE
    signOut.setOnClickListener { view:View->
        googleSignInClient.signOut().addOnCompleteListener {
            task -> disptext.text = " "
            signOut.visibility= View.INVISIBLE
        }
    }
}

@SuppressLint("NewApi")
override fun onBackPressed() {
    super.onBackPressed()
    startActivity(Intent(this,SplashscreenActivity::class.java))
  }
}
private fun Any.unregisterCallback(callbackManager: CallbackManager?, facebookCallback: FacebookCallback<LoginResult>) {

}

fun isloggedIn(): Boolean {
val accessToken = AccessToken.getCurrentAccessToken()
return accessToken != null
}

清单文件:在清单文件中,我添加了元数据。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.vishwa.imaginators">
<uses-permission android:name="android.permission.INTERNET" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/myicon"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".SplashscreenActivity"
        android:theme="@style/AppTheme"
        android:noHistory="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".LoginActivity">
    </activity>
    <activity android:name=".SigninActivity">
    </activity>
    <activity android:name=".SignupActivity">
    </activity>
    <activity android:name=".EmailSignupActivity">
    </activity>
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />

    <activity android:name="com.facebook.FacebookActivity"
        android:configChanges=
            "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:label="@string/app_name"/>
    <activity android:name=".MainActivity">

    </activity>
 </application>

 </manifest>

出现的错误是Caused by: com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 10。我已经看过这个issue,但没有答案可以解决我的问题。

我还将发布错误日志,以更加清楚。

FATAL EXCEPTION: main
              Process: com.example.vishwa.imaginators, PID: 27350
              java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=0, data=Intent { (has extras) }} to activity {com.example.vishwa.imaginators/com.example.vishwa.imaginators.SignupActivity}: com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 10: 
                  at android.app.ActivityThread.deliverResults(ActivityThread.java:3772)
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3815)
                  at android.app.ActivityThread.access$1500(ActivityThread.java:154)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1430)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:157)
                  at android.app.ActivityThread.main(ActivityThread.java:5571)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)
               Caused by: com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 10: 
                  at com.google.android.gms.tasks.zzu.getResult(Unknown Source)
                  at com.example.vishwa.imaginators.SignupActivity.onActivityResult(SignupActivity.kt:117)
                  at android.app.Activity.dispatchActivityResult(Activity.java:6562)
                  at android.app.ActivityThread.deliverResults(ActivityThread.java:3768)
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3815) 
                  at android.app.ActivityThread.access$1500(ActivityThread.java:154) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1430) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:157) 
                  at android.app.ActivityThread.main(ActivityThread.java:5571) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635) 
               Caused by: com.google.android.gms.common.api.ApiException: 10: 
                  at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source)
                  at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source)
                  at com.example.vishwa.imaginators.SignupActivity.onActivityResult(SignupActivity.kt:115)
                  at android.app.Activity.dispatchActivityResult(Activity.java:6562) 
                  at android.app.ActivityThread.deliverResults(ActivityThread.java:3768) 
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3815) 
                  at android.app.ActivityThread.access$1500(ActivityThread.java:154) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1430) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:157) 
                  at android.app.ActivityThread.main(ActivityThread.java:5571) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635) 

此外,您还会注意到我的项目也具有Facebook登录集成。但是现在添加Google登录后,它也无法正常工作。因此,我希望能有所帮助。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您的AndroidManifest.XML在我看来是正确的。我遇到了相同的错误:

Caused by: com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 10

这基本上意味着您要提供未知的服务器客户端ID。 在Google Developer Console中,选择您生成的项目:OAuth client ID-> Web应用程序,然后在您的Android应用程序中使用此Web应用程序客户端ID。

编辑:

我绝对知道问题出在添加到Firebase控制台的SHA1键中。因此,您可以重新生成它,然后再次将其正确放置在同一项目中。还请确保:

1)您实际签名的Android apk具有与项目的Firebase控制台中指定的指纹相同的SHA1指纹。请参阅“ Android集成”部分,该页面可在其中下载google-services.json

2)您的Firebase项目已与Google Play链接。为此,转到页面Project Overview,然后转到Project Settings(齿轮图标),然后转到Integration tab。在该标签上,将Google Play链接到您的项目。

最后一个应该可以解决您的问题。