我正在使用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登录后,它也无法正常工作。因此,我希望能有所帮助。任何帮助表示赞赏。
答案 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链接到您的项目。
最后一个应该可以解决您的问题。