[Android] Ignoring header X-Firebase-Locale because its value was null. 에러

알린·2024년 2월 20일
0

TroubleShooting

목록 보기
14/25

에러 상황

Firebase 연동으로 회원가입 및 로그인 구현을 하는 도중 다음 에러 발생

Ignoring header X-Firebase-Locale because its value was null.

구글링 해서 나오는 매니패스트 파일에 코드 추가, 애뮬레이터 와이파이 확인, 비밀번호 6자리 이상, 올바른 이메일 형식으로 입력 등 모두 해봤지만 해결되지 않았었다.

나의 에러 상황은 다음과 같다.

  • 회원가입은 정상적으로 작동되며, Firebase Authentication에도 가입한 유저가 잘 들어오는 것을 확인함
  • 다음 로그인 코드 실행 시 다음 액티비티로 넘어가지도 않고, "아이디와 비밀번호를 확인해주세요." 토스트 메세지도 뜨지 않음.
  • 로그 확인해보았더니 위와 같은 W 메세지 뜸
class LoginActivity : AppCompatActivity() {
    private lateinit var binding: ActivityLoginBinding
    private lateinit var auth: FirebaseAuth
    private var user: FirebaseUser? = null
    private lateinit var email: String
    private lateinit var password: String


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

        binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)

        auth = Firebase.auth

        setOnClickBtn()
    }

    private fun setOnClickBtn() {
        val btn_login = binding.btnLogin
        // 로그인 버튼
        btn_login.setOnClickListener {
            if (login() == true) {
                val intent = Intent(this, MainActivity::class.java)
                startActivity(intent)
                finish()
            }
        }
    }

    // 로그인
    private fun login():Boolean {
        var loginResult = false
        email = binding.etAdress.text.toString()
        password = binding.etPassword.text.toString()

        if (email.isBlank()) {
            Toast.makeText(this,"아이디를 입력해주세요..", Toast.LENGTH_SHORT).show()
        } else if (password.isBlank()) {
            Toast.makeText(this,"비밀번호를 입력해주세요..", Toast.LENGTH_SHORT).show()
        } else {
            auth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        Log.d(TAG, "signInWithEmail:success")
                        user = auth.currentUser
                        loginResult = true
                    } else {
                        Log.w(TAG, "signInWithEmail:failure", task.exception)
                        Toast.makeText(baseContext, "아이디와 비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show()
                    }
                }
        }
        return loginResult
    }
}

에러 원인 및 해결

에러 원인

로그인 실행 함수 내에서 로그인이 성공한 if (task.isSuccessful) 부분 내에서 Activity 전환을 하지 않고,
setOnClickBtn()에서 로그인 함수를 받아 login()이 true를 반환할 때 Activity 전환을 한 것이 문제였다.

파이어베이스 공식 문서의 로그인 구현 예시 코드에서도 if (task.isSuccessful) 내에서 updateUI가 이루어지는 것을 확인할 수 있다.

auth.signInWithEmailAndPassword(email, password)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // Sign in success, update UI with the signed-in user's information
            Log.d(TAG, "signInWithEmail:success")
            val user = auth.currentUser
            updateUI(user)
        } else {
            // If sign in fails, display a message to the user.
            Log.w(TAG, "signInWithEmail:failure", task.exception)
            Toast.makeText(
                baseContext,
                "Authentication failed.",
                Toast.LENGTH_SHORT,
            ).show()
            updateUI(null)
        }
    }

분명 공식 문서를 참고하며 코드를 작성했는데도 내 멋대로 작성해 이런 에러를 발생시켜 꽤 많은 시간을 에러 해결에 투자했다.
앞으로 구현 시 이런 부분까지도 신경써야겠다.

에러 해결

setOnClickBtn()에서 로그인 버튼 클릭이벤트가 들어오면 login() 함수를 실행시켜 login() 함수 내에서 액티비티 전환까지 이루어지도록 수정했다.

액티비티 전환을 하면서 user 데이터도 함께 넘겨주었다.

setOnClickBtn()에서 로그인 버튼 클릭이벤트 처리만 하는 것 처럼 보여도, 실제 코드에서는 해당 액티비티의 모든 버튼 클릭이벤트를 처리하고 있으므로 login() 함수 내에서 로그인 버튼의 클릭이벤트까지 처리하진 않았다.

class LoginActivity : AppCompatActivity() {
    private lateinit var binding: ActivityLoginBinding
    private lateinit var auth: FirebaseAuth
    private var user: FirebaseUser? = null


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

        binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)

        auth = Firebase.auth

        setOnClickBtn()
    }

    private fun setOnClickBtn() {
        val btn_login = binding.btnLogin

        // 로그인 버튼
        btn_login.setOnClickListener {
            login()
        }
    }

    // 로그인
    private fun login() {
        val email = binding.etAdress.text.toString()
        val password = binding.etPassword.text.toString()
        if (email.isBlank()) {
            Toast.makeText(this, "아이디를 입력해주세요.", Toast.LENGTH_SHORT).show()
        } else if (password.isBlank()) {
            Toast.makeText(this, "비밀번호를 입력해주세요.", Toast.LENGTH_SHORT).show()
        } else {
            auth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    Log.d("LoginActivity", "signInWithEmail:success")
                    user = auth.currentUser

                    val intent = Intent(this, MainActivity::class.java)
                    intent.putExtra("user", user)
                    startActivity(intent)
                    finish()
                } else {
                    Log.w("LoginActivity", "signInWithEmail:failure", task.exception)
                    Toast.makeText(baseContext, "아이디와 비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}
profile
Android 짱이 되고싶은 개발 기록 (+ ios도 조금씩,,👩🏻‍💻)

0개의 댓글