google-ar / sceneform-android-sdk

Sceneform SDK for Android
https://developers.google.com/sceneform/develop/
Apache License 2.0
1.23k stars 604 forks source link

RenderableSource.Builder cannot handle Content URIs #477

Open ning-y opened 5 years ago

ning-y commented 5 years ago

Passing content URIs instead of URLs (file URLs still seem to work fine) fail with java.net.MalformedURLException: unknown protocol: content. It seems they are being handled as though they are URLs.

On the other hand, the docs seem to imply that any URI is acceptable, and Google has been pushing for the use of content URIs for better privacy and stuff. Would be good if content URI support was added, or at least if the docs were clarified on this matter.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultIntent) {
    if (requestCode == IMPORT_GLB_FILE_RESULT && resultCode == RESULT_OK) {
        Uri uri = resultIntent.getData();
        setModelRenderable(uri);
    }
}

private void setModelRenderable(Uri uri) {
    ModelRenderable.builder()
            .setSource(this, RenderableSource.builder().setSource(
                    this,
                    uri,
                    RenderableSource.SourceType.GLB)
                    .setScale(0.5f)
                    .setRecenterMode(RenderableSource.RecenterMode.ROOT)
                    .build()
            )
            .setRegistryId(cacheFileName)
            .build()
            .thenAccept(renderable -> modelRenderable = renderable)
            .exceptionally(
                    throwable -> {
                        Log.e(TAG, null, throwable);
                        return null;
                    });
}
2018-12-21 21:54:42.351 19236-19420/io.ningyuan.palantir E/ModelRenderable: Unable to load Renderable registryId='1545400482300'
    java.util.concurrent.CompletionException: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Unable to parse url: 'content://com.android.providers.downloads.documents/document/2581'
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.inputStreamToByteBuffer(LoadRenderableFromSfbTask.java:185)
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0(LoadRenderableFromSfbTask.java:117)
        at com.google.ar.sceneform.rendering.-$$Lambda$LoadRenderableFromSfbTask$0DkaOpfpmr8DYlbaxWogZtUpKTw.get(Unknown Source:4)
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1625)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Unable to parse url: 'content://com.android.providers.downloads.documents/document/2581'
        at com.google.ar.sceneform.assets.RenderableSource.downloadUri(Unknown Source:26)
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:33)
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:0)
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.inputStreamToByteBuffer(LoadRenderableFromSfbTask.java:182)
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0(LoadRenderableFromSfbTask.java:117) 
        at com.google.ar.sceneform.rendering.-$$Lambda$LoadRenderableFromSfbTask$0DkaOpfpmr8DYlbaxWogZtUpKTw.get(Unknown Source:4) 
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1625) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 
     Caused by: java.lang.IllegalArgumentException: Unable to parse url: 'content://com.android.providers.downloads.documents/document/2581'
        at com.google.ar.sceneform.utilities.LoadHelper.remoteUriToInputStreamCreator(Unknown Source:56)
        at com.google.ar.sceneform.utilities.LoadHelper.fromUri(Unknown Source:40)
        at com.google.ar.sceneform.assets.RenderableSource.downloadUri(Unknown Source:9)
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:33) 
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:0) 
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.inputStreamToByteBuffer(LoadRenderableFromSfbTask.java:182) 
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0(LoadRenderableFromSfbTask.java:117) 
        at com.google.ar.sceneform.rendering.-$$Lambda$LoadRenderableFromSfbTask$0DkaOpfpmr8DYlbaxWogZtUpKTw.get(Unknown Source:4) 
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1625) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 
     Caused by: java.net.MalformedURLException: unknown protocol: content
        at java.net.URL.<init>(URL.java:597)
        at java.net.URL.<init>(URL.java:487)
        at java.net.URL.<init>(URL.java:436)
        at com.google.ar.sceneform.utilities.LoadHelper.remoteUriToInputStreamCreator(Unknown Source:6)
        at com.google.ar.sceneform.utilities.LoadHelper.fromUri(Unknown Source:40) 
        at com.google.ar.sceneform.assets.RenderableSource.downloadUri(Unknown Source:9) 
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:33) 
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:0) 
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.inputStreamToByteBuffer(LoadRenderableFromSfbTask.java:182) 
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0(LoadRenderableFromSfbTask.java:117) 
        at com.google.ar.sceneform.rendering.-$$Lambda$LoadRenderableFromSfbTask$0DkaOpfpmr8DYlbaxWogZtUpKTw.get(Unknown Source:4) 
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1625) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 
2018-12-21 21:54:42.352 19236-19420/io.ningyuan.palantir E/SceneformActivity: null
    java.util.concurrent.CompletionException: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Unable to parse url: 'content://com.android.providers.downloads.documents/document/2581'
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.inputStreamToByteBuffer(LoadRenderableFromSfbTask.java:185)
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0(LoadRenderableFromSfbTask.java:117)
        at com.google.ar.sceneform.rendering.-$$Lambda$LoadRenderableFromSfbTask$0DkaOpfpmr8DYlbaxWogZtUpKTw.get(Unknown Source:4)
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1625)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Unable to parse url: 'content://com.android.providers.downloads.documents/document/2581'
        at com.google.ar.sceneform.assets.RenderableSource.downloadUri(Unknown Source:26)
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:33)
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:0)
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.inputStreamToByteBuffer(LoadRenderableFromSfbTask.java:182)
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0(LoadRenderableFromSfbTask.java:117) 
        at com.google.ar.sceneform.rendering.-$$Lambda$LoadRenderableFromSfbTask$0DkaOpfpmr8DYlbaxWogZtUpKTw.get(Unknown Source:4) 
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1625) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 
     Caused by: java.lang.IllegalArgumentException: Unable to parse url: 'content://com.android.providers.downloads.documents/document/2581'
        at com.google.ar.sceneform.utilities.LoadHelper.remoteUriToInputStreamCreator(Unknown Source:56)
        at com.google.ar.sceneform.utilities.LoadHelper.fromUri(Unknown Source:40)
        at com.google.ar.sceneform.assets.RenderableSource.downloadUri(Unknown Source:9)
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:33) 
        at com.google.ar.sceneform.assets.RenderableSource.call(Unknown Source:0) 
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.inputStreamToByteBuffer(LoadRenderableFromSfbTask.java:182) 
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0(LoadRenderableFromSfbTask.java:117) 
        at com.google.ar.sceneform.rendering.-$$Lambda$LoadRenderableFromSfbTask$0DkaOpfpmr8DYlbaxWogZtUpKTw.get(Unknown Source:4) 
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1625) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 
     Caused by: java.net.MalformedURLException: unknown protocol: content
        at java.net.URL.<init>(URL.java:597)
        at java.net.URL.<init>(URL.java:487)
        at java.net.URL.<init>(URL.java:436)
        at com.google.ar.sceneform.utilities.LoadHelper.remoteUriToInputStreamCreator(Unknown Source:6)
ishaang10 commented 5 years ago

I also have the same issue.. i want to use the content uri. if you have solved it then please help . thanks

ashmilhussain commented 5 years ago

I too have same problem . please post here if you receive the solution.

ashmilhussain commented 5 years ago

Hi, My issue got resolved. I was trying to load texture from an image using setSource(Context context, Uri sourceUri) , which was not working for content URI then i found setSource(Bitmap bitmap) this method then i converted my image to bitmap and user setSource(bitmap). It solved my issue.

ning-y commented 5 years ago

@claywilkinson Hi! Any updates?