3

I'm trying to set an ImageView with an image with public permissions. The image loads correctly from the browser but inside my app it's not working:

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

The exception is not very clear, i just get:

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)

Do i need to add something else to the URL? I was under the impression that public files could be accessed as is.

Roberto Betancourt
  • 2,375
  • 3
  • 27
  • 35
  • Can you post the exact URL (or do you prefer not to)? – Karim May 22 '15 at 17:12
  • I'd prefer not to but the link is correct and it does work when loading from a browser. – Roberto Betancourt May 22 '15 at 17:22
  • This code ought to work. To produce that stack trace, there must have been some issue in parsing the URI. Can you dump out `Uri.parse().getScheme()` ? – tyronen May 29 '15 at 11:42
  • 1
    Actually, your exception message appears to have an extra whitespace at the beginning. Could that be why the scheme didn't parse? – tyronen Jun 04 '15 at 11:08
  • Is this still an issue? I'm wondering why are there two spaces between 'Uri is:' and 'https://..' in your error message. If you look at ProducerSequenceFactory.java file, there should be only one: https://github.com/facebook/fresco/blob/master/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerSequenceFactory.java – Kamran Jun 08 '15 at 15:40
  • Kamran, i solved the problem by changing the URL to "https://storage-download.googleapis.com...." instead of "https://storage.googleapis.com" It really took me a while to find this out as it isn't documented anywhere by Google – Roberto Betancourt Jun 08 '15 at 15:46
  • cool. for upload you can use 'storage-upload.googleapis.com' and for download 'storage-download.googleapis.com' URIs. For more information about GCS Request URIs, visit this article: https://cloud.google.com/storage/docs/reference-uris – Kamran Jun 08 '15 at 16:35

1 Answers1

2

I solved the problem by changing the URL to "storage-download.googleapis.com...."; instead of "storage.googleapis.com"; It really took me a while to find this out as it isn't documented anywhere by Google

Roberto Betancourt
  • 2,375
  • 3
  • 27
  • 35
  • For GCS Request URIs, visit this article: https://cloud.google.com/storage/docs/reference-uris – Kamran Jun 08 '15 at 16:38