android - 用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 令牌上,如果用户已经注册,那么我不希望它去用户名检查。
解决方案
我能够通过不调用在创建时为用户设置我的 uid 来解决这个问题,而是在我点击登录并获得成功后设置它。
推荐阅读
- python - 如何为我的 RDFLib 图中的所有资源设置 rdfs:isDefinedBy?
- loopback4 - 如何在 Loopback 4.0 中提供静态内容?
- git - 使用标签——来自前 CVS 用户的问题
- python - Google Drive API - 服务帐户的文件下载问题
- python - 在 numpy 库中的多维数组中进行索引
- json - 解析失败:JSONDecoder Swift
- c++ - 使用 gcc 的库的动态链接
- google-apps-script - 有没有办法每天保存一次不断变化的值并将其存储在谷歌表格中?
- c - 在带有联合的 typedef 结构中,我需要实例化所有变量吗?
- python - 如何上传图像并尝试使用 DL 模型进行预测