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

안드로이드 스튜디오 구글로그인 관련해서 질문합니다

0 추천

안드로이드 스튜디오로 구글로그인 후 메인페이지로 넘어가는걸 구현하려고 합니다.

구글로그인 버튼을 클릭하면 구글계정으로 로그인 후 메인페이지로 넘어가는걸 원하는데 버튼을 클릭하면 메인페이지로 넘어가는 동작과 구글계정 선택창이 동시에 뜹니다

뭐가 문제일까요?

 

아래에 코드도 올립니다. 언어는 코틀린이고 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) {

            }
    }
}

 

bhs5121 (130 포인트) 님이 2022년 10월 18일 질문

1개의 답변

+2 추천
버튼 클리 시 호출되는 함수가 문제네요

한 함수에서 둘다 호출하니.....

 

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()

    }
Elan's (760 포인트) 님이 2022년 10월 19일 답변
로그인페이지가 1페이지이고 메인페이지가 2페이지입니다. 구글로그인후 2페이지로 넘어가게 하고 싶은데 작성자님 말씀처럼 함수를 삭제하면 로그인만 되고 페이지가 넘어가지가 않습니다.
또 토스트메세지도 로그인하고 나서 뜨게 하고싶은데 구글로그인 버튼을 누르자마자 토스트메세지가 뜹니다.

어떻게 해야 할까요?
전체 코드 공유가 아니시기에 정확하지 않지만 말씀하신 내용 토대로 보면 구글 로그인 진행되고 결과가 전달되는 함수가 'handleSignInResult'으로 보이는데요 여기서 정보 받고 토스트 띄우고 2페이지로 넘어가시면 될거 같은데요
개발을 하실때 순서도를 그리시고 그에 따라 작업하도록 해보세요
그럼 지금 같은 문제를 줄이실수 있을 겁니다
...