无法使用Fresco从Google Cloud Storage加载公共图像

3

我正在尝试使用公共权限设置一个带有图像的ImageView。这张图片可以在浏览器中正确加载,但在我的应用程序中无法工作:

Uri uri=Uri.parse("https://storage.googleapis.com/mybucket/filename.jpg");

                    ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
                        @Override
                        public void onFinalImageSet(
                                String id,
                                @Nullable ImageInfo imageInfo,
                                @Nullable Animatable anim) {
                            if (imageInfo == null) {
                                return;
                            }
                            QualityInfo qualityInfo = imageInfo.getQualityInfo();
                            FLog.d("Final image received! " +
                                            "Size %d x %d",
                                    "Quality level %d, good enough: %s, full quality: %s",
                                    imageInfo.getWidth(),
                                    imageInfo.getHeight(),
                                    qualityInfo.getQuality(),
                                    qualityInfo.isOfGoodEnoughQuality(),
                                    qualityInfo.isOfFullQuality());
                        }

                        @Override
                        public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
                            FLog.d(TAG,"Intermediate image received");
                        }

                        @Override
                        public void onFailure(String id, Throwable throwable) {
                            FLog.e(getClass(), throwable, "Error loading %s", id);
                        }
                    };

                    PipelineDraweeControllerBuilder controller = Fresco.newDraweeControllerBuilder()
                            .setControllerListener(controllerListener)
                            .setUri(uri);
                    // other setters

                    imageView.setController(controller.build());

异常信息不是很清晰,我只获取到:
java.lang.RuntimeException: Unsupported uri scheme! Uri is:  https://storage.googleapis.co...
        at com.facebook.imagepipeline.core.ProducerSequenceFactory.getBasicDecodedImageSequence(ProducerSequenceFactory.java:176)
        at com.facebook.imagepipeline.core.ProducerSequenceFactory.getDecodedImageProducerSequence(ProducerSequenceFactory.java:129)
        at com.facebook.imagepipeline.core.ImagePipeline.fetchDecodedImage(ImagePipeline.java:147)
        at com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder.getDataSourceForRequest(PipelineDraweeControllerBuilder.java:82)
        at com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder.getDataSourceForRequest(PipelineDraweeControllerBuilder.java:31)
        at com.facebook.drawee.controller.AbstractDraweeControllerBuilder$2.get(AbstractDraweeControllerBuilder.java:320)
        at com.facebook.drawee.controller.AbstractDraweeControllerBuilder$2.get(AbstractDraweeControllerBuilder.java:317)
        at com.facebook.drawee.backends.pipeline.PipelineDraweeController.getDataSource(PipelineDraweeController.java:96)
        at com.facebook.drawee.controller.AbstractDraweeController.submitRequest(AbstractDraweeController.java:392)
        at com.facebook.drawee.controller.AbstractDraweeController.onAttach(AbstractDraweeController.java:332)
        at com.facebook.drawee.view.DraweeHolder.attachController(DraweeHolder.java:276)
        at com.facebook.drawee.view.DraweeHolder.setController(DraweeHolder.java:222)
        at com.facebook.drawee.view.DraweeView.setController(DraweeView.java:87)

我需要在URL中添加其他内容吗?我认为公共文件可以直接访问。


这段代码应该是可以正常运行的。要产生那个堆栈跟踪,必须在解析URI时出现了一些问题。你能够输出 Uri.parse(<your url>).getScheme() 吗? - tyronen
1
实际上,你的异常信息似乎在开头有一个额外的空格。这可能是方案无法解析的原因吗? - tyronen
这个问题还存在吗?我想知道为什么你的错误信息中“Uri is:”和“https://..”之间有两个空格。如果你查看ProducerSequenceFactory.java文件,应该只有一个:https://github.com/facebook/fresco/blob/master/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerSequenceFactory.java - Kamran
Kamran,我通过将URL从“https://storage.googleapis.com”更改为“https://storage-download.googleapis.com....”解决了这个问题。由于谷歌没有在任何文档中记录这一点,我真的花了很长时间才找到它。 - Roberto Betancourt
酷。上传可以使用“storage-upload.googleapis.com”,下载可以使用“storage-download.googleapis.com” URI。有关GCS请求URI的更多信息,请访问此文章:https://cloud.google.com/storage/docs/reference-uris - Kamran
显示剩余2条评论
1个回答

2

我通过将URL更改为“storage-download.googleapis.com...”而不是“storage.googleapis.com”,解决了这个问题。由于谷歌没有记录此信息,因此我花费了一些时间才找到解决方法。


有关 GCS 请求 URI,请访问此文章:https://cloud.google.com/storage/docs/reference-uris - Kamran

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