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

点击按钮上传两张图片到Firebase Storage并将URL存入Firestore的实现方案

第一步 修复现有代码的隐藏问题

你当前的checkAndSetImage方法存在参数传递问题:Java中方法参数是值传递,你在方法内部给参数filePath赋值,不会修改全局声明的coverUri和profileUri,会导致后续上传时拿到的Uri始终为null。可以将方法调整为如下实现:

private void checkAndSetImage(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK || data == null || data.getData() == null) {
        return;
    }
    Uri imageUri = data.getData();
    try {
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
        if (requestCode == COVER_IMG_REQUEST) {
            coverUri = imageUri;
            binding.coverPhoto.setImageBitmap(bitmap);
        } else if (requestCode == PROFILE_IMG_REQUEST) {
            profileUri = imageUri;
            binding.profilePhoto.setImageBitmap(bitmap);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

对应的onActivityResult同步调整为:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    checkAndSetImage(requestCode, resultCode, data);
}

第二步 确保添加Firebase相关依赖

在模块级build.gradle的dependencies块中添加如下依赖(已添加可忽略):

dependencies {
    // Firebase Storage
    implementation 'com.google.firebase:firebase-storage:20.0.0'
    // Cloud Firestore
    implementation 'com.google.firebase:firebase-firestore:24.4.0'
}

第三步 实现保存按钮点击上传逻辑

首先全局初始化Firebase实例:

private FirebaseStorage storage = FirebaseStorage.getInstance();
private FirebaseFirestore db = FirebaseFirestore.getInstance();
// 替换为你当前登录用户的唯一标识,可从Firebase Auth获取
private String currentUid = "your_current_user_id";

然后给保存btn设置点击事件:

binding.saveBtn.setOnClickListener(v -> {
    // 校验是否选中了图片
    if (coverUri == null && profileUri == null) {
        Toast.makeText(this, "请至少选择一张图片", Toast.LENGTH_SHORT).show();
        return;
    }
    // 存储上传后的图片链接
    Map<String, Object> userImgMap = new HashMap<>();
    List<Task<Uri>> uploadTasks = new ArrayList<>();

    // 上传封面图
    if (coverUri != null) {
        StorageReference coverRef = storage.getReference().child("users/" + currentUid + "/cover.jpg");
        UploadTask coverUploadTask = coverRef.putFile(coverUri);
        uploadTasks.add(coverUploadTask.continueWithTask(task -> {
            if (!task.isSuccessful()) {
                throw task.getException();
            }
            return coverRef.getDownloadUrl();
        }).addOnSuccessListener(uri -> {
            userImgMap.put("coverUrl", uri.toString());
        }));
    }

    // 上传头像
    if (profileUri != null) {
        StorageReference profileRef = storage.getReference().child("users/" + currentUid + "/profile.jpg");
        UploadTask profileUploadTask = profileRef.putFile(profileUri);
        uploadTasks.add(profileUploadTask.continueWithTask(task -> {
            if (!task.isSuccessful()) {
                throw task.getException();
            }
            return profileRef.getDownloadUrl();
        }).addOnSuccessListener(uri -> {
            userImgMap.put("profileUrl", uri.toString());
        }));
    }

    // 等待所有上传任务完成后,将链接存入Firestore
    Tasks.whenAllSuccess(uploadTasks).addOnSuccessListener(objects -> {
        db.collection("users").document(currentUid)
                .update(userImgMap)
                .addOnSuccessListener(unused -> {
                    Toast.makeText(this, "图片保存成功", Toast.LENGTH_SHORT).show();
                })
                .addOnFailureListener(e -> {
                    Toast.makeText(this, "数据库保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                });
    }).addOnFailureListener(e -> {
        Toast.makeText(this, "图片上传失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    });
});

注意事项

  • 需要提前配置Firebase Storage的读写权限,避免出现权限拒绝错误
  • 代码中的currentUid请替换为实际的当前登录用户ID,推荐从Firebase Auth中获取
  • 可以根据业务需求调整Storage中图片的存储路径和文件名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:36:03