使用带Glide的Firebase存储图像

问题描述 投票:6回答:4

我尝试了几乎所有这些答案都有大量的重复答案,但我仍然无法使用Glide的Firebase存储图像。

首先,我使用的是docs

    FirebaseStorage storage  = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReference();
    StorageReference pathReference = storageRef.child("sorular/1.jpg");

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

   // Load the image using Glide
   Glide.with(this /* context */)
        .using(new FirebaseImageLoader()) // Cannot resolve method 'using
        .load(pathReference)
        .into(imageView);

如果我清理Glide的.using部分,logcat就会出现这个错误:

E / GlideExecutor:请求抛出未捕获的throwable com.bumptech.glide.Registry $ NoModelLoaderAvailableException:无法找到模型的任何ModelLoaders:gs://123...appspot.com/sorular/1.jpg 在com.bumptech.glide.Registry.getModelLoaders(Registry.java:227) at com.bumptech.glide.load.engine.DecodeHelper.getLoadData(DecodeHelper.java:179)at com.bumptech.glide.load.engine.DecodeHelper.getCacheKeys(DecodeHelper.java:197)at com.bumptech.glide.load .engine.ResourceCacheGenerator.startNext(ResourceCacheGenerator.java:41)位于com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:282)的com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob) .java:249)在com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:222) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607)at java.lang.Thread.run(Thread.java:761) ) 在com.bumptech.glide.load.engine.executor.GlideExecutor $ DefaultThreadFactory $ 1.run(GlideExecutor.java:347)

那么如何以最好的方式在我的Android应用程序中使用firebase存储图像呢?

这也是我的构建gradle依赖项:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support:palette-v7:27.0.2'
    implementation "com.android.support:cardview-v7:27.0.2"
    implementation "com.android.support:recyclerview-v7:27.0.2"
    implementation "com.android.support:support-v4:27.0.2"
    implementation 'com.android.support:design:27.0.2'

    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.github.florent37:materialviewpager:1.2.3'


    implementation 'com.google.firebase:firebase-database:11.8.0'
    implementation 'com.google.firebase:firebase-storage:11.8.0'
    implementation 'com.firebaseui:firebase-ui-storage:2.0.1'
    implementation 'com.google.firebase:firebase-auth:11.8.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
android firebase android-gradle firebaseui android-glide
4个回答
13
投票

改变这个:

 implementation 'com.firebaseui:firebase-ui-storage:2.0.1'

对此:

  implementation 'com.firebaseui:firebase-ui-storage:3.2.1'

根据Glide文档:

using()

在Glide 4中删除了using()API,以鼓励用户使用AppGlideModule注册其组件一次,以避免重复使用对象。不是每次加载图像时都创建一个新的ModelLoader,而是在AppGlideModule中注册一次,然后让Glide检查你的模型(传递给load()的对象)以确定何时使用你注册的ModelLoader。

要确保仅对某些模型使用ModelLoader,请按上面所示实现handle()以检查每个模型,并仅在应使用ModelLoader时返回true。

using()被从Glide 4中移除。

要解决此问题,您需要执行以下操作:要从StorageReference加载图像,请首先注册AppGlideModule:

  @GlideModule
public class MyAppGlideModule extends AppGlideModule {

@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
    // Register FirebaseImageLoader to handle StorageReference
    registry.append(StorageReference.class, InputStream.class,
            new FirebaseImageLoader.Factory());
  }
}

创建AppGlideModule类并完成干净构建后,可以使用GlideApp将StorageReference加载到ImageView中:

// Reference to an image file in Cloud Storage
StorageReference storageReference = ...;

// ImageView in your Activity
ImageView imageView = ...;

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
GlideApp.with(this /* context */)
        .load(storageReference)
        .into(imageView);

更多信息:https://github.com/firebase/FirebaseUI-Android/tree/master/storage


0
投票

至于Glide 4.6.1,你不能使用.using(new FirebaseImageLoader())

我有权降级到

implementation 'com.github.bumptech.glide:glide:3.8.0'

和Firebase UI implementation'com.firebaseui:firebase-ui-storage:2.0.1'


0
投票

上面的答案对我没有帮助。

我在格斗中错过了这个。

annotationProcessor 'com.github.bumptech.glide:compiler:4.x'

我找到的最好的文档是here


0
投票

如果您已将图标上的小图片上传到Firebase存储空间,请摆脱滑行和“模型”。它对git做了很多改变。所以你的代码应该是这样的:

   StorageReference referenseLcl = FirebaseStorage.getInstance().getReference();
                StorageReference islandRefLcl = referenseLcl.child(userLcl.getImageIconPath());
                final long ONE_MEGABYTE = 1024 * 1024;
                islandRefLcl.getBytes(ONE_MEGABYTE).addOnSuccessListener(bytesPrm -> {
                    Bitmap bmp = BitmapFactory.decodeByteArray(bytesPrm, 0, bytesPrm.length);
                    imageOfUser.setImageBitmap(bmp);
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        imageOfUser.setImageResource(R.mipmap.ic_launcher);
                    }
                });
© www.soinside.com 2019 - 2024. All rights reserved.