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

如何从Firebase获取当前用户头像与名称?现有方法失效需解决

解决Firebase获取用户名称和头像的问题

看起来你遇到的问题是因为之前依赖的FirebaseUser.getDisplayName()只能读取Firebase Auth中存储的用户信息,但你的应用应该是把用户的名称、头像单独存在了Firebase数据库(Realtime Database或Firestore)里,所以这个方法才会失效。下面是具体的解决步骤:

步骤1:获取当前登录用户的UID

首先还是要拿到当前用户的唯一标识UID,这一步和你之前的操作一致:

FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser == null) {
    // 处理用户未登录的情况,比如跳转到登录页
    Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show();
    return;
}
String uid = currentUser.getUid();

步骤2:从Firebase数据库读取用户名称和头像

假设你的数据库结构是users节点下以UID为子节点,包含name和avatar(头像URL)字段,分两种数据库类型说明:

情况A:使用Firebase Realtime Database

// 获取到对应用户的数据库引用
DatabaseReference userDbRef = FirebaseDatabase.getInstance().getReference("users").child(uid);

// 添加值事件监听器,实时获取用户数据
userDbRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if (snapshot.exists()) {
            // 读取名称和头像URL
            String userName = snapshot.child("name").getValue(String.class);
            String avatarUrl = snapshot.child("avatar").getValue(String.class);
            
            // 更新TextView显示用户名称
            TextView userNameTv = findViewById(R.id.tv_user_name);
            userNameTv.setText(userName);
            
            // 加载头像到ImageView,这里用Glide举例(需要先添加Glide依赖)
            ImageView avatarIv = findViewById(R.id.iv_user_avatar);
            Glide.with(SecondActivity.this)
                 .load(avatarUrl)
                 .placeholder(R.drawable.default_avatar) // 加载时的占位图
                 .error(R.drawable.error_avatar) // 加载失败时的图
                 .circleCrop() // 如果需要圆形头像
                 .into(avatarIv);
        } else {
            Toast.makeText(SecondActivity.this, "未找到用户信息", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // 处理读取失败的情况
        Toast.makeText(SecondActivity.this, "获取用户信息失败:" + error.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

情况B:使用Firebase Firestore

如果你的用户数据存在Firestore的users集合中,代码如下:

FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.collection("users").document(uid)
        .get()
        .addOnSuccessListener(documentSnapshot -> {
            if (documentSnapshot.exists()) {
                String userName = documentSnapshot.getString("name");
                String avatarUrl = documentSnapshot.getString("avatar");
                
                // 同样更新UI
                TextView userNameTv = findViewById(R.id.tv_user_name);
                userNameTv.setText(userName);
                
                ImageView avatarIv = findViewById(R.id.iv_user_avatar);
                Glide.with(SecondActivity.this)
                     .load(avatarUrl)
                     .placeholder(R.drawable.default_avatar)
                     .error(R.drawable.error_avatar)
                     .circleCrop()
                     .into(avatarIv);
            }
        })
        .addOnFailureListener(e -> {
            Toast.makeText(SecondActivity.this, "获取用户信息失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        });

关键说明:为什么之前的方法失效?

FirebaseUser.getDisplayName()是读取Firebase Auth用户对象里的显示名称,只有当你在用户注册/登录时,通过UserProfileChangeRequest把名称设置到Auth中,这个方法才能拿到值。如果你的应用是把用户资料存在数据库而非Auth里,这个方法自然返回null或者空值。

额外注意事项

  • 确保你的数据库规则设置正确,允许已登录用户读取自己的资料,比如Realtime Database的规则可以设置:
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
  • 如果使用Glide加载图片,需要在app级build.gradle中添加依赖:
implementation 'com.github.bumptech.glide:glide:4.16.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:21:38