使用带Glide的Firebase存储图像

meh*_*met 9 android firebase android-gradle-plugin android-glide firebaseui

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

首先我使用的是文档

    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);
Run Code Online (Sandbox Code Playgroud)

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

E/GlideExecutor:请求抛出未捕获的throwable com.bumptech.glide.Registry $ NoModelLoaderAvailableException:无法在com.bumptech.glide中找到模型的任何ModelLoaders:gs:
//123...appspot.com/sorular/1.jpg. Registry.getModelLoaders(Registry.java:227)
位于com.bumptech.glide.load.engine.DecodeHelper.getLoadData(DecodeHelper.java:179)的com.bumptech.glide.load.engine.DecodeHelper.getCacheKeys(DecodeHelper.java: 197)com.bumptech.glide.load.engine.ResourceCacheGenerator.startNext(ResourceCacheGenerator.java:41)at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:282)at com.bumptech.glide .load.engine.DecodeJob.runWrapped(DecodeJob.java:249)at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:222)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java) :1133)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607)at java.lang.Thread.run(Thread.java:761)
at com.bumptech.glide.load.engine.executor. GlideExe cutor $ 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'
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*dad 14

改变这个:

 implementation 'com.firebaseui:firebase-ui-storage:2.0.1'
Run Code Online (Sandbox Code Playgroud)

对此:

  implementation 'com.firebaseui:firebase-ui-storage:3.2.1'
Run Code Online (Sandbox Code Playgroud)

根据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());
  }
}
Run Code Online (Sandbox Code Playgroud)

创建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);
Run Code Online (Sandbox Code Playgroud)

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


小智 6

我知道我有点晚了,但它可能对你们中的一些人有所帮助。在app build.gradle.

implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' //For Kotlin You should use kapt instead of annotationProcessor though.
Run Code Online (Sandbox Code Playgroud)

然后添加这个类:

@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());
    }
}

 GlideApp.with(getActivity()).load(storageReference).into(profileImg);
Run Code Online (Sandbox Code Playgroud)

最后你需要去 File-> Invalidate Cache and Restart Done :)

  • “最后你需要转到文件 -> 使缓存无效并重新启动” - 节省我的 2 天!谢谢!!!! (2认同)