点击按钮上传两张图片到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
相关产品推荐
相关产品推荐

