FirebaseでのGoogle認証のKotlinでのコードです。
ほとんどマニュアル通りなんですが、ちょっとだけハマったので残しておきます。
GoogleSignIn.getSignedInAccountFromIntent
この処理、非同期なんですが、addOnCompleteListenerで後続処理してやる必要はないそうです。
が、処理確認の.getResultのところで、.getResult(ApiException::class.java)をしてやらないと、ApiException:12502でエラーになっちゃうことがあります。
エラーコード12502というのは、ここにあるように、サインイン処理中ということ、ちょっと待てということなんでしょうが。
マニュアル上ではしれっと書いてますが。。。
private lateinit var mAuth: FirebaseAuth
private lateinit var mGoogleSignInClient : GoogleSignInClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.XXXX)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build()
mGoogleSignInClient = GoogleSignIn.getClient(this, gso)
mAuth = FirebaseAuth.getInstance()
googleSignIn()
}
private fun googleSignIn(){
var googleSignInIntent = mGoogleSignInClient?.signInIntent
startActivityForResult(googleSignInIntent, RC_SIGN_IN)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RC_SIGN_IN){
var task = GoogleSignIn.getSignedInAccountFromIntent(data)
task.addOnCompleteListener {
try {
var account = task.getResult(ApiException::class.java)
if (account != null) firebaseAuthWithGoogle(account)
} catch (e: Exception) {
//Action for error
}
}
}
}
private fun firebaseAuthWithGoogle(acct : GoogleSignInAccount){
val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this) {
if (it.isSuccessful){
//Action for success
} else {
//Action for error
}
}
}