从Firebase存储获取图像

3

我对Firebase存储的概念还不太了解。

我做了一些研究,找到了这个Glider。可以将图像添加到imageView中。现在它给了我这个错误。

如何解决?

还有其他方法吗?

24 09:39:00.286 14919-14919/azcrew.eatapp E/AndroidRuntime: FATAL EXCEPTION: main
  Process: azcrew.eatapp, PID: 14919
  java.lang.IllegalArgumentException: Unknown type class com.google.firebase.storage.StorageReference. You must provide a Model of a type for which there is a registered ModelLoader, if you are using a custom model, you must first call Glide#register with a ModelLoaderFactory for your custom model class
    at com.bumptech.glide.RequestManager.loadGeneric(RequestManager.java:629)
    at com.bumptech.glide.RequestManager.load(RequestManager.java:598)
    at azcrew.eatapp.halfdone.Cari$2.onSuccess(Cari.java:76)
    at azcrew.eatapp.halfdone.Cari$2.onSuccess(Cari.java:73)
    at com.google.android.gms.tasks.zzj.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:155)
    at android.app.ActivityThread.main(ActivityThread.java:5696)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

这是代码:

这里是代码

StorageReference mStorageRef = FirebaseStorage.getInstance().getReference();
final StorageReference imgRef = mStorageRef.child("images/img.jpg");
final long ONE_MEGABYTE = 1024*1024;


imgRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        Glide.with(Cari.this).load(imgRef).diskCacheStrategy(DiskCacheStrategy.ALL).into(kuryerImg);
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {

    }
});
4个回答

4
我有另一种解决问题的方法。
您可以获取图像的下载URL。 这是来自Google指南的代码。
StorageReference storageRef = 
  FirebaseStorage.getInstance().getReference();    
 storageRef.child("users/me/profile.png").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
   }
});

如果你需要下载图片到你的设备,这里有一个Stackoverflow链接提供指引: 从URL下载图片


但我不想让用户下载并保存别人的照片到他的手机上。 - Akhundzade
抱歉,我不知道你想做什么。 你能描述一下你计划做什么吗? - Titusz Tatai
请遵循以下存储规则:https://firebase.google.com/docs/storage/security/start - Shaifali Rajput
这个URL不会自动下载您的图像。它将为您提供一个直接链接到保存在Firebase存储中的图像。 - Shaifali Rajput
我现在明白了。您想要保存到内存,并仅将其用于绘制到屏幕上。 - Titusz Tatai

4

使用 FirebaseImageLoader

Glide.with(this /* context */)
    .using(new FirebaseImageLoader())
    .load(storageReference)
    .into(imageView);

0

使用通用加载器而不是Glide,它比Glide更快地加载图像

   DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
        .cacheOnDisc(true).cacheInMemory(true)
        .imageScaleType(ImageScaleType.EXACTLY)
        .displayer(new FadeInBitmapDisplayer(300)).build();

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
        getApplicationContext())
        .defaultDisplayImageOptions(defaultOptions)
        .memoryCache(new WeakMemoryCache())
        .discCacheSize(100 * 1024 * 1024).build();

ImageLoader.getInstance().init(config);

final ImageLoader imageLoader = ImageLoader.getInstance();

final DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
        .cacheOnDisc(true).resetViewBeforeLoading(true)
        .showImageForEmptyUri(R.mipmap.preview)
        .showImageOnFail(R.mipmap.preview)
        .build();


 mdatabase.child(Table_item).addValueEventListener(new ValueEventListener() {


    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Map map = (Map) dataSnapshot.getValue();
        String image1 = (String) map.get("imagename");
        String image2 = (String) map.get("image2name");
        imageLoader.displayImage(ImageView1, image1, options, new ImageLoadingListener() {

            @Override
            public void onLoadingStarted(String imageUri, View view) {

            }

            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {


            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {
                progressBar.setVisibility(View.GONE);
            }
        });
        imageLoader.displayImage(ImageView2, image2name, options, new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String imageUri, View view) {

            }

            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                i++;
                progressstatus(i);
            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {
                progressBar.setVisibility(View.GONE);

            }
        });

使用以下依赖项:

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

0
 StorageReference mStorageRef = FirebaseStorage.getInstance().getReference();
                final StorageReference imgRef = mStorageRef.child("/images/"+"sea");//sea is my imageName.No, need to addextension

                imgRef.getDownloadUrl().addOnSuccessListener(uri -> {
                    Picasso.get().load(uri).into(profilePicture);
                }).addOnFailureListener(exception -> {
                    Log.d("error===========",exception.getMessage());
                });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接