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

Android分类应用开发:Firebase getDownloadUrl()方法找不到错误求助

解决Firebase Storage的getDownloadUrl()找不到的问题

嘿,别着急,这个问题我之前刚踩过坑!你遇到的cannot find symbol method getDownloadUrl()错误,是因为Firebase Storage SDK在较新的版本中,已经移除了TaskSnapshot类里的getDownloadUrl()方法,现在需要通过存储引用(StorageReference)来异步获取下载链接。

问题原因

在旧版Firebase SDK中,UploadTask.TaskSnapshot确实提供了getDownloadUrl()方法,但后来Firebase把这个方法移到了StorageReference类中,而且获取下载链接变成了一个异步操作(因为需要和服务器交互生成临时有效链接)。

修改后的代码

我帮你把代码调整成符合最新SDK的写法,重点修改onSuccess里获取下载链接的部分,还顺手修复了一个小bug:

private void executeUploadTask() {
    Toast.makeText(getActivity(), "uploading image", Toast.LENGTH_SHORT).show();
    final String postId = FirebaseDatabase.getInstance().getReference().push().getKey();
    final StorageReference storageReference = FirebaseStorage.getInstance().getReference()
           .child("posts/users/" + FirebaseAuth.getInstance().getCurrentUser().getUid() + "/" + postId + "/post_image");
    UploadTask uploadTask = storageReference.putBytes(mUploadBytes);
    
    uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Toast.makeText(getActivity(), "Upload Success", Toast.LENGTH_SHORT).show();
            
            // 重点:通过StorageReference异步获取下载链接
            storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri firebaseUri) {
                    Log.d(TAG, "onSuccess: firebase download url: " + firebaseUri.toString());
                    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
                    Post post = new Post();
                    post.setImage(firebaseUri.toString());
                    post.setCity(mCity.getText().toString());
                    post.setContact_email(mContactEmail.getText().toString());
                    post.setCountry(mCountry.getText().toString()); // 修复:之前误写为mContactEmail
                    post.setDescription(mDescription.getText().toString());
                    post.setPost_id(postId);
                    post.setPrice(mPrice.getText().toString());
                    post.setState_province(mStateProvince.getText().toString());
                    post.setTitle(mTitle.getText().toString());
                    post.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
                    
                    reference.child(getString(R.string.node_posts))
                           .child(postId)
                           .setValue(post);
                    resetFields();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(getActivity(), "Failed to get download URL", Toast.LENGTH_SHORT).show();
                    Log.e(TAG, "onFailure: Get URL error", e);
                }
            });
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(getActivity(), "could not upload photo", Toast.LENGTH_SHORT).show();
            Log.e(TAG, "onFailure: Upload failed", e);
        }
    }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
            double currentProgress = (100 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
            if( currentProgress > (mProgress + 15)){
                mProgress = (100 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                Log.d(TAG, "onProgress: upload is " + mProgress + "% done");
                Toast.makeText(getActivity(), mProgress + "%", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

额外提醒

  • 确保依赖版本正确:检查你Module级别的build.gradle,Firebase Storage依赖要使用较新版本,比如:
    implementation 'com.google.firebase:firebase-storage:20.3.0' // 可根据官方最新版本调整
    
  • 错误日志很关键:我在失败监听器里加了详细日志打印,后续排查问题时能更快定位原因。
  • 字段赋值小错误:你之前把country字段误赋值为mContactEmail的内容,我已经帮你修正为mCountry,避免数据错误。

这样修改后,就能正常获取图片下载链接并存入Firebase数据库啦!

内容的提问来源于stack exchange,提问作者Ankit Chourey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:09:15