首页 > 解决方案 > 用Facebook登录,第二次登录时Firebase正在改变UID,Kotlin Android Studio

问题描述

我想在加载活动时自动登录,如果它之前已登录但未注销,但是当我创建一个新用户时,在注释掉启动时检查用户是否部分登录后,它会崩溃,我也可以创建一个使用 facebook 登录的用户并转到下一个活动,但是当我退出并使用 facbook 按钮重新登录时,它会创建一个我不想要的新 UID,我希望它能够识别出有一个用户使用该 ip 登录脸书。我是 Kotlin 的新手,我通常使用 ios 和 Swift,并且可以这样做。

public override fun onStart() {
    super.onStart()

    // Check if user is signed in (non-null) and update UI accordingly.
    val currentUser = auth.currentUser
    progressBar.visibility = View.INVISIBLE

    if (auth.currentUser == null) {
        println("Tony signed out")
    }else {
        Toast.makeText(this, "Already Signed in :)", Toast.LENGTH_LONG).show()
        println("Tony signed in")
        userID = auth?.currentUser?.uid!!
        val intent = Intent(this, ProjectsVC::class.java)
        progressBar.visibility = View.INVISIBLE
        startActivity(Intent(this, ProjectsVC::class.java))
    }

}

我的按钮

facebookLogin.setOnClickListener {
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"))
        progressBar.visibility = View.VISIBLE
        facebookLogin()
    }

脸书功能

private fun facebookLogin() {

    callbackManager = CallbackManager.Factory.create()


    LoginManager.getInstance().registerCallback(callbackManager, object : FacebookCallback<LoginResult> {

        override fun onSuccess(loginResult: LoginResult) {

            Log.d("Main", "facebook:onSuccess:$loginResult")

            handleFacebookAccessToken(loginResult.accessToken)
        }

处理令牌

private fun handleFacebookAccessToken(token: AccessToken) {
    progressBar.visibility = View.VISIBLE
    Log.d("Main", "handleFacebookAccessToken:$token")
    println("Tony started facebook login")

    val credential = FacebookAuthProvider.getCredential(token.token)

    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                println("Tony task facebook login")
                // Sign in success, update UI with the signed-in user's information
                Log.d("Main", "signInWithCredential:success")

                usernameCheck {success ->
                    if (success == true) {
                        if (userExist) {
                            println("Tony User exists")
                            progressBar.visibility = View.INVISIBLE
                        }else {
                            println("Tony User doesn't exist")
                            val mAlertDialog = AlertDialog.Builder(this@LogInVC)
                            mAlertDialog.setTitle("Enter a Username")
                            mAlertDialog.setMessage("This will allow you to be added to other projects")
                            val view = layoutInflater.inflate(R.layout.alert_verify_vc, null)
                            view.codeVerify.hint = "Username"
                            view.codeVerify.inputType = InputType.TYPE_TEXT_FLAG_CAP_WORDS
                            mAlertDialog.setView(view)
                            mAlertDialog.setPositiveButton("Ok") { dialog: DialogInterface?, id: Int ->
                                userName = view.codeVerify.text.toString()
                                progressBar.visibility = View.VISIBLE
                                val post = HashMap<String, Any>()
                                post["username"] = userName

                                db.collection ("users").document(userID)
                                    .set(post)
                                    .addOnSuccessListener { Log.d("UserCheck2", "Tony DocumentSnapshot successfully written!") }
                                    .addOnFailureListener { e -> Log.w("UserCheck2", " Tony Error writing document", e) }
                                    println("Tony db check uid is $userID and username $userName")
                                checkNameExists { success ->
                                    if (success) {
                                        if (userNameExist) {
                                            println("Tony Username used")
                                           // create alert that has a check function and write function on ok


                                            }else {
                                            println("Tony Username not used")
                                            val post2 = HashMap<String, Any>()
                                            post2["UserID"] = userID
                                            db.collection("usernames").document(userName)
                                                .set(post2)
                                                .addOnSuccessListener { Log.d("UserCheck", "Tony DocumentSnapshot successfully written!")
                                                    val intent = Intent(this, ProjectsVC::class.java)
                                                    progressBar.visibility = View.INVISIBLE
                                                    startActivity(intent)
                                                }
                                                .addOnFailureListener { e -> Log.w("UserCheck", "Tony Error writing document", e) }

                                        }
                                    }else {
                                        println("Tony Error")
                                    }
                                }
                            }
                            mAlertDialog.setNegativeButton("Cancel") { dialog: DialogInterface?, id: Int ->
                                dialog?.dismiss()
                            }
                            progressBar.visibility = View.INVISIBLE
                            mAlertDialog.show()
                        }
                    }else {
                    println("Tony not success")
                        progressBar.visibility = View.INVISIBLE
                }
                }
                println("Tony Finished facebook login")
            } else {
                // If sign in fails, display a message to the user.
                Log.w("Main", "signInWithCredential:failure", task.exception)
                Toast.makeText(
                    baseContext, "Authentication failed.",
                    Toast.LENGTH_SHORT
                ).show()
                progressBar.visibility = View.INVISIBLE
            }

        }
}

在句柄 facbook 令牌上,如果用户已经注册,那么我不希望它去用户名检查。

标签: androidfacebookfirebasekotlin

解决方案


我能够通过不调用在创建时为用户设置我的 uid 来解决这个问题,而是在我点击登录并获得成功后设置它。


推荐阅读