如何从FirebaseStorage获取图像并将其转换为位图

时间:2020-05-16 12:37:30

标签: android firebase bitmap firebase-storage android-glide

我正在启动一个异步函数来获取StorageReference,从中获取StreamDownloadTask,并尝试从其Bitmap中创建InputStream

userRepository.getUserImg(id).stream
            .addOnSuccessListener { // StreamDownloadTask.TaskSnapshot!
                val picture = BitmapFactory.decodeStream(it.stream) // it.stream reported to return an InputStream
                user.value!!.img = picture
            }
            .addOnFailureListener { exception ->
                Log.e(TAG, exception.toString())
            }

但是,当我启动此功能时,出现此错误:

W/System.err: android.os.NetworkOnMainThreadException
W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
        at com.google.android.gms.org.conscrypt.Platform.blockGuardOnNetwork(:com.google.android.gms@200414022@20.04.14 (040700-294335909):0)
        at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(:com.google.android.gms@200414022@20.04.14 (040700-294335909):2)
        at com.android.okhttp.okio.Okio$2.read(Okio.java:138)
        at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
        at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:51)
        at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:395)
W/System.err:     at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
        at com.google.firebase.storage.StreamDownloadTask$StreamProgressWrapper.read(com.google.firebase:firebase-storage@@19.1.1:408)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:248)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:288)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:347)
        at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
        at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:790)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:765)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:806)
        at it.polito.phony.lab3.user.profile.ShowProfileViewModel$loadUser$4.onSuccess(ShowProfileViewModel.kt:49)
        at it.polito.phony.lab3.user.profile.ShowProfileViewModel$loadUser$4.onSuccess(ShowProfileViewModel.kt:18)
        at com.google.firebase.storage.StorageTask.lambda$new$0(com.google.firebase:firebase-storage@@19.1.1:123)
        at com.google.firebase.storage.StorageTask$$Lambda$1.raise(Unknown Source:6)
        at com.google.firebase.storage.TaskListenerImpl.lambda$onInternalStateChanged$2(com.google.firebase:firebase-storage@@19.1.1:90)
        at com.google.firebase.storage.TaskListenerImpl$$Lambda$3.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

我还尝试通过从Bitmap获取ByteArray来获取StorageReference,但是BitmapFactory无法创建Bitmap,因为它根据我的理解,我希望收到一个byte[]而不是ByteArray作为参数。

2 个答案:

答案 0 :(得分:0)

一旦我使用 piccasso 完成了以下操作(假设您知道如何从firebase获取图像uri,请告诉我是否也需要该代码)

    Thread thread = new Thread() {
                        public void run() {
                            try {
                                Bitmap bitmap = Picasso.with(getActivity())
                                        .load(uri).get();
                            } catch (Exception e) {
                               e.printStackTrace();
                            }
                        }
                    };
                    thread.start();
                })

由于某些原因,无法在主线程上调用get()方法

安东尼奥·桑托罗(Antonio Santoro)有美好的一天

答案 1 :(得分:0)

我不知道MVVM方法,但是它可能会给您一个解决方案,可以解决此问题。

您可以尝试以下方法:

         Glide.with(getApplicationContext()).asBitmap().load(imgUrl).into(new CustomTarget<Bitmap>() {

                            @Override
                            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                                img_icon.setImageBitmap(resource);

                            }

                            @Override
                            public void onLoadCleared(@Nullable Drawable placeholder) {


                            }
                        });