안드로이드 스튜디오로 구글로그인 후 메인페이지로 넘어가는걸 구현하려고 합니다.
구글로그인 버튼을 클릭하면 구글계정으로 로그인 후 메인페이지로 넘어가는걸 원하는데 버튼을 클릭하면 메인페이지로 넘어가는 동작과 구글계정 선택창이 동시에 뜹니다
뭐가 문제일까요?
아래에 코드도 올립니다. 언어는 코틀린이고 firebase authentication 사용 안하는 방식으로 코딩했습니다
package com.example.loginbeta01
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import com.example.loginbeta01.databinding.ActivityMainBinding
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException
import com.google.android.gms.tasks.Task
class MainActivity : AppCompatActivity() {
lateinit var mGoogleSignInClient: GoogleSignInClient
lateinit var resultLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
val binding = ActivityMainBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
setResultSignUp()
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestProfile()
.build()
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
with(binding) {
btnSignIn.setOnClickListener {
signIn()
}
btnGoSubActivity.setOnClickListener {
goSubActivity()
}
}
setContentView(binding.root)
}
private fun goSubActivity() {
val intent = Intent(this, SubActivity::class.java)
startActivity(intent)
Toast.makeText(this@MainActivity, "Login successful", Toast.LENGTH_SHORT).show()
}
private fun setResultSignUp() {
resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val task: Task<GoogleSignInAccount> =
GoogleSignIn.getSignedInAccountFromIntent(result.data)
handleSignInResult(task)
}
}
}
private fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) {
try {
val account = completedTask.getResult(ApiException::class.java)
val email = account?.email.toString()
val familyName = account?.email.toString()
val givenName = account?.givenName.toString()
val displayName = account?.displayName.toString()
val photoURL = account?.photoUrl.toString()
Log.d("로그인한 유저의 이메일", email)
Log.d("로그인한 유저의 성", familyName)
Log.d("로그인한 유저의 이름", givenName)
Log.d("로그인한 유저의 전체이름", displayName)
Log.d("로그인한 유저의 프로필 사진의 주소", photoURL)
} catch (e: ApiException) {
Log.w("failed", "signInResult:failed code=" + e.statusCode)
}
}
private fun signIn() {
val intent = Intent(this, SubActivity::class.java)
startActivity(intent)
val signInIntent: Intent = mGoogleSignInClient.getSignInIntent()
resultLauncher.launch(signInIntent)
Toast.makeText(this@MainActivity, "Login successful", Toast.LENGTH_SHORT).show()
}
private fun revokeAccess() {
mGoogleSignInClient.revokeAccess()
.addOnCompleteListener(this) {
}
}
}