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
相关产品推荐
相关产品推荐

