마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

구글 연동시 튕김 현상

0 추천
class Main : AppCompatActivity() {
    lateinit var imageview : ImageView
    val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
    lateinit var mGoogleSignInClient: GoogleSignInClient
    lateinit var resultLauncher: ActivityResultLauncher<Intent>

    override fun onStart() {
        super.onStart()
        val account = GoogleSignIn.getLastSignedInAccount(this)
        account?.let {
            Toast.makeText(this, "Logged In", Toast.LENGTH_SHORT).show()
        } ?: Toast.makeText(this, "Not Yet", Toast.LENGTH_SHORT).show()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        
        setResultSignUp()

        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestProfile()
            .build()

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        with(binding) {
            btnSignIn.setOnClickListener {
                signIn()
            }
        }
    }
}

로그인 인증하고 앱이 꺼져버리는데 뭐가 문제인지 파악이 안됩니다! https://soopeach.tistory.com/176 여기 참고했어요

enerigpy (2,110 포인트) 님이 2023년 1월 12일 질문
signIn() 함수와 에러로그를 올려보시는 것이 좋을 것 같습니다.
처음 로그인하고 튕긴 다음 다시 실행했을때 토스트로 로그인됐다고 나오는데 원래 동작은 로그인하고 바로 메인 액티비티로 가야하는데 그 중간에 앱이 종료되네요 처음 로그인 인증할때도 앱이 종료되더라구요

private fun signIn() {
        val signInIntent: Intent = mGoogleSignInClient.getSignInIntent()
        resultLauncher.launch(signInIntent)
    }
startActivityForResult를 호출하면 제대로 동작하는지 보시구요. 이상이 없다면 resultLauncher가 문제일 가능성이 높겠네요. resultLauncher 클래스와 초기화 하는 부분도 올려보세요.
참고로, 변경된 구글 로그인 방식입니다.
https://developers.google.com/identity/one-tap/android/get-started
gradle 문제는 없는거 같고

private fun setResultSignUp() {
        resultLauncher =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
                if (result.resultCode == Activity.RESULT_OK) {
                    val task: Task<GoogleSignInAccount> =
                        GoogleSignIn.getSignedInAccountFromIntent(result.data)
                    handleSignInResult(task)

                }
            }
    }

1개의 답변

+1 추천
 
채택된 답변

resultLauncher 를 초기화가 클래스 생성시에 되어야 하기 때문에 멤버 변수형태로 하셔야 합니다. 

private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
                ...
    }

 

 

spark (224,800 포인트) 님이 2023년 1월 15일 답변
enerigpy님이 2023년 1월 15일 채택됨
onCreate 위에  lateinit var resultLauncher: ActivityResultLauncher<Intent>
이렇게 선언했는데 같은거 아닌가요?
달라요. lateinit var는 나중에 초기화를 하는 거구요, 제가 보여드린 코드는 클래스 멤버로 되어 있기 때문에 클래스 생성시 초기화가 되는 거예요. ActivityResultLauncher는 클래스 생성 시에 초기화 되도록 해야 에러가 없어요.
아래 링크의 Note 섹션을 보시면 해당 설명이 나와요.
https://developer.android.com/training/basics/intents/result#launch

Note: You must call registerForActivityResult() before the fragment or activity is created; you cannot launch the ActivityResultLauncher until the fragment or activity's Lifecycle has reached CREATED.
...