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

Firebase Authentication(Android)中displayName与photoUrl为空问题

Firebase邮箱密码认证中displayName/photoUrl返回null的解决办法

问题原因

通过邮箱密码方式创建Firebase用户时,Auth系统只会自动初始化uid和email字段,displayName、photoUrl这类附加信息不会自动填充,必须主动调用API进行设置。

解决步骤

  1. 注册成功后更新用户资料
    在createUserWithEmailAndPassword的成功回调中,先构造UserProfileChangeRequest对象,传入需要设置的姓名和头像地址,再调用updateProfile()提交更新(异步操作,需在回调中处理后续逻辑)。

  2. 空安全处理
    避免直接调用toString()导致空指针异常,使用空安全操作符处理可能为null的字段。

修改后的代码示例

注册逻辑更新:

firebaseAuth.createUserWithEmailAndPassword(email, pass).addOnCompleteListener{
    if(it.isSuccessful){
        val firebaseUser = firebaseAuth.currentUser
        if (firebaseUser != null) {
            // 替换为实际获取的用户姓名和头像URL(比如从输入框、选择的图片地址获取)
            val profileUpdates = UserProfileChangeRequest.Builder()
                .setDisplayName(binding.etUserName.text.toString())
                .setPhotoUri(Uri.parse("https://your-storage-url/avatar.jpg"))
                .build()

            firebaseUser.updateProfile(profileUpdates)
                .addOnCompleteListener { updateTask ->
                    if (updateTask.isSuccessful) {
                        // 资料更新完成后再执行UI跳转和用户保存
                        updateUI(firebaseUser)
                    } else {
                        Toast.makeText(this, "资料更新失败:${updateTask.exception?.message}", Toast.LENGTH_SHORT).show()
                    }
                }
        }
    } else {
        if(it.exception is FirebaseAuthUserCollisionException)
            Toast.makeText(this, "该邮箱已注册!", Toast.LENGTH_SHORT).show()
    }
}

updateUI方法优化:

private fun updateUI(firebaseUser: FirebaseUser) {
    val uid = firebaseUser.uid
    val displayName = firebaseUser.displayName ?: "未设置姓名"
    val email = firebaseUser.email ?: "未设置邮箱"
    val photoUrl = firebaseUser.photoUrl?.toString() ?: ""

    val user = User(uid, displayName, email, photoUrl)
    val userDao = UserDao()
    userDao.addUser(user)

    val intent = Intent(this, MainActivity::class.java)
    startActivity(intent)
    finish()
}

额外说明

  • 如果使用本地图片作为头像,需要先将图片上传至Firebase Storage或其他可访问的存储服务,获取公开的URL后再传入setPhotoUri。
  • 若用户注册时未提供姓名或头像,可设置默认值(如示例中的"未设置姓名"),避免后续逻辑出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:10:29