You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端使用Firebase手机号认证时如何设置用户displayName

解决方案

Firebase 手机号认证的PhoneAuthOptions构建阶段没有提供设置displayName的入口,这个配置类仅承载手机号验证流程必需的参数(手机号、超时时间、验证回调、绑定的Activity等),不支持传入用户昵称、头像这类个人资料字段。
用户的displayName属性需要在手机号验证成功、拿到已登录的FirebaseUser实例后,通过官方提供的资料更新接口设置,设置完成后全局都可以通过mAuth.currentUser读取到对应值。


具体实现流程

  • 提前收集用户昵称:建议在手机号输入页同步提供昵称输入框,和手机号一起提交,将昵称值通过Intent传递到OTP验证页,避免验证成功后打断登录流程跳转收集昵称。
  • 登录成功后更新用户资料:OTP校验通过、signInWithCredential返回成功后,构建UserProfileChangeRequest对象设置displayName,调用更新接口完成Auth侧的资料写入。
  • 资料写入成功后再执行业务逻辑:等资料更新的异步回调返回成功后,再读取displayName写入实时数据库、跳转主页,避免出现存到空值的问题。

代码参考

发起手机号验证的原有逻辑不需要调整,保持如下即可:

val options=PhoneAuthOptions.newBuilder(mAuth)
    .setPhoneNumber(number)
    .setTimeout(60L,TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(callbacks)
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)
Log.d("MSG","Auth started")

修改OTP验证成功后的逻辑,加入displayName更新与存储代码:

mAuth.signInWithCredential(credential)
    .addOnCompleteListener(this){ task->
        if(task.isSuccessful){
            val currentUser = mAuth.currentUser ?: return@addOnCompleteListener
            // 替换为你提前收集到的用户输入昵称,比如从Intent extras中获取、或当前页面输入框取值
            val userInputNickname = "用户填写的昵称"

            // 构建用户资料更新请求
            val profileUpdateRequest = UserProfileChangeRequest.Builder()
                .setDisplayName(userInputNickname)
                .build()

            // 提交资料更新到Firebase Auth
            currentUser.updateProfile(profileUpdateRequest)
                .addOnCompleteListener { updateTask ->
                    if (updateTask.isSuccessful) {
                        // 资料更新成功后再执行后续逻辑
                        val loginPref = getSharedPreferences("login", MODE_PRIVATE)
                        loginPref.edit().putBoolean("LogedIn", true).apply()
                        
                        val db = FirebaseDatabase.getInstance()
                        val dbRef = db.reference

                        val phoneNumber = currentUser.phoneNumber!!
                        val uid = currentUser.uid
                        // 此时可直接读取到已更新的displayName
                        val displayName = currentUser.displayName!!

                        // 按业务需求存储字段,注意:不建议完全丢弃uid字段
                        // uid是Firebase Auth生成的用户全局唯一、不可变更标识,displayName可被用户随时修改,不适合作为用户数据的唯一关联键
                        dbRef.child("Users").child(phoneNumber).setValue(displayName)

                        startActivity(Intent(this, MainActivity::class.java))
                        finish()
                    } else {
                        Toast.makeText(this, "昵称设置失败,请重试", Toast.LENGTH_SHORT).show()
                    }
                }
        }
        else {
            Toast.makeText(this, "Invalid OTP", Toast.LENGTH_SHORT).show()
        }
    }

注意事项

  • 如果业务需要支持用户后续修改昵称,在任意登录页面拿到currentUser实例后,都可以用同样的updateProfile方法更新displayName,更新后全局读取到的都是最新值。
  • 不要依赖displayName做用户唯一判定,该字段用户可自由修改,关联用户业务数据请优先使用固定不变的uid字段。

内容的提问来源于stack exchange,提问作者ApunichGULSHER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:03:18