Firebase Authentication(Android)中displayName与photoUrl为空问题
Firebase邮箱密码认证中displayName/photoUrl返回null的解决办法
问题原因
通过邮箱密码方式创建Firebase用户时,Auth系统只会自动初始化uid和email字段,displayName、photoUrl这类附加信息不会自动填充,必须主动调用API进行设置。
解决步骤
注册成功后更新用户资料
在createUserWithEmailAndPassword的成功回调中,先构造UserProfileChangeRequest对象,传入需要设置的姓名和头像地址,再调用updateProfile()提交更新(异步操作,需在回调中处理后续逻辑)。空安全处理
避免直接调用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
相关产品推荐
相关产品推荐

