【问题标题】:Downloading image from Firebase storage into imageview on android studio java将图像从 Firebase 存储下载到 android studio java 上的 imageview
【发布时间】:2021-07-19 03:46:42
【问题描述】:

我正在尝试使用 Java 将图像从 Firebase 存储下载到 android studio 应用程序上的 imageView。我已经浏览了超过 6 个小时的 stackoverflow,所以我很可能已经阅读了任何“类似”的问题。我尝试了各种方法,但建议最多且似乎最简单的方法是使用 glide。我无法让它工作,也找不到错误。我什至放了一个常规的谷歌图片链接来尝试,它仍然显示为空白。

我添加的依赖项

implementation'com.firebaseui:firebase-ui-storage:6.4.0'
implementation'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor'com.github.bumptech.glide:compiler:4.12.0'

我用过的代码

ImageView imageView = findViewById(R.id.resultImage);
Glide.with(this).load("string of image").into(imageView);

我也试过这个代码

StorageReference ref = storage.getReferenceFromUrl("urlforimage");

// ImageView in your Activity
ImageView imageView = findViewById(R.id.uploadedImage);

// Download directly from StorageReference using Glide
Glide.with(this /* context */)
    .load(ref)
    .into(imageView);

还有这段代码

public class Breed_Search_Page1Activity extends AppCompatActivity {
ImageView rImage;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_breed__search__page1);
    
    rImage = findViewById(R.id.rImage);
    
    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    
    DatabaseReference databaseReference = firebaseDatabase.getReference();
    
    DatabaseReference getImage = databaseReference.child("image");
    
    getImage.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String link = dataSnapshot.getValue(String.class);
            Picasso.get().load(link).into(rImage);
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            // we are showing that error message in toast
            Toast.makeText(Breed_Search_Page1Activity.this, "Error Loading Image", Toast.LENGTH_SHORT).show();
        }
    });
}
}

更新 - 我让它使用下面的代码,但想知道有没有办法仅使用文件名从 Firebase 存储中显示它?当我从我的笔记本电脑上传一张图像时,我想尽快在应用程序中显示它,所以如果我可以对其进行编码,以便它具有我将在上传时使用的文件名,它会在上传后显示,而无需手动更改任何内容

ImageView image = (ImageView) findViewById(R.id.rImage);

String url = "https//...";
Glide.with(getApplicationContext()).load(url).into(image);

添加监听器后我的 logcat

2021-04-27 10:35:01.780 14347-14576/com.example.woofsapp E/StorageException: 
StorageException has occurred.
    Object does not exist at location.
 Code: -13010 HttpResult: 404
2021-04-27 10:35:01.781 14347-14576/com.example.woofsapp E/StorageException: 
{  "error": {    "code": 404,    "message": "Not Found.  Could not get 
object",    "status": "GET_OBJECT"  }}
    java.io.IOException: {  "error": {    "code": 404,    "message": "Not 
Found.  Could not get object",    "status": "GET_OBJECT"  }}
    at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:434)
    at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:451)
    at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:442)
    at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:272)
    at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:286)
    at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:70)
    at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:62)
    at com.google.firebase.storage.GetDownloadUrlTask.run(GetDownloadUrlTask.java:76)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)

给出 logcat 错误的代码 - 请注意,我确实直接从文档中复制了 MyAppGlideModule

ImageView image = findViewById(R.id.rImage);
    StorageReference storageReference = 
FirebaseStorage.getInstance().getReference("Images/dogs.jpg");

    
storageReference.child("dogs.jpg").getDownloadUrl().addOnSuccessListener(new 
OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            // Got the download URL for 'users/me/profile.png'
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle any errors
        }
    });

【问题讨论】:

  • 您的日志猫出现了什么错误?
  • 这是我的 logcat 中仅有的两件事 - 2021-04-26 09:53:44.847 12063-12063/? E/Zygote: isWhitelistProcess - 进程被列入白名单 2021-04-26 09:53:44.848 12063-12063/? E/Zygote: accessInfo : 1 这些是在 logcat 的最开始,经过研究,我知道它们并不是真正的错误。当我按下应该将我带到带有图像的新页面的按钮时,logcat 中没有显示错误

标签: java android firebase-storage android-glide


【解决方案1】:

在我的应用中,我有这样的东西:

StorageReference storageReference = FirebaseStorage.getInstance().getReference("FolderName/photoName.format");

我正在使用带有文件名的路径。

参考,查看官方文档-Download files with Cloud Storage on Android

【讨论】:

  • 将 val 替换为 StorageReference storageReference 吗?然后我会在我的代码中用 storageReference 代替 url?
  • @tech123 将val替换为StorageReference,变量的类型,上面分享的代码是Kotlin的。
  • 我添加了它,但它没有工作。我的图像不在文件夹中,它们只是在存储中,所以在图像名称之前我需要什么吗?我添加了这段代码 ImageView image = (ImageView) findViewById(R.id.rImage); StorageReference storageReference = FirebaseStorage.getInstance().getReference("dogs.jpg"); Glide.with(getApplicationContext()).load(storageReference).into(image);'=
  • @tech123 在这种情况下只是正确的文件名和格式
  • @tech123 您的加载方式是正确的,您的文件有问题,是否可以公开访问?安全规则设置是否正确?看,Firebase 的官方文档herehere,他们使用的方式完全相同。
猜你喜欢
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2019-02-11
  • 2019-03-20
  • 1970-01-01
  • 2018-12-11
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多