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
相关产品推荐
相关产品推荐

