Файл не найден в сцене 1.16

Мое приложение не может прочитать/загрузить файл с локального компьютера. Я использую Android Studio 4.0 и Sceneform 1.16. Код работает нормально, если я использую путь https (например, https://storage.googleapis.com/ar-answers-in-search-models/static/Tiger/model.glb)

Проблема в ошибке "Файл не найден". В приведенном ниже коде я также использую getApplicationContext() вместо this. Проблемная часть

ModelRenderable.builder()
                    .setSource(this,Uri.parse("/sampledata/models/abc.glb")  )    <--- Problem
                    .setIsFilamentGltf(true)
                    .build()
                    .thenAccept(......

Добавили следующие разрешения:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

Спасибо за вашу помощь.


person user13855411    schedule 03.07.2020    source источник


Ответы (3)


Я смог получить изображение через

ModelRenderable.builder()
                    .setSource(this,R.raw.abc) 

Но я не получаю текстуру или материал. Я экспортирую изображение/объект из блендера. Кроме того, хотелось бы знать, может ли uri.parse() работать с локально сохраненным объектом. Вышеописанный способ имеет свои ограничения.

Не помечая это как решенное на данный момент.

person user13855411    schedule 04.07.2020

Вы можете поместить свой glb в каталог asset.

И загрузите его, как показано ниже

ModelRenderable.builder().setSource(this, Uri.parse("model.glb"))

Или, если ваш glb сохранен в памяти устройства,

ModelRenderable.builder().setSource(this, Uri.fromFile(File(YOUR_GLB_PATH)))

person SGTCheung    schedule 09.07.2020
comment
Оба они, похоже, не работали. Я предполагаю, что это проблема с sceneform 1.16. Я получаю сообщение об ошибке: E/ModelRenderable: невозможно загрузить Renderable registerId='file:///assets/abc.glb' java.util.concurrent.CompletionException: java.io.FileNotFoundException: /assets/abc.glb (нет такого файл или каталог) по адресу com.google.ar.sceneform.utilities.SceneformBufferUtils.inputStreamToByteBuffer(SceneformBufferUtils.java:108) по адресу com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0$LoadRenderableFromSfbTask(LoadRenderableFromSfb8Task.java:111 ). Спасибо - person user13855411; 10.07.2020
comment
Дважды проверьте, находится ли файл glb в вашем каталоге активов. Допустим, ваше имя файла glb — model.glb, затем вы используете его как параметр для Uri,parse(), например, ModelRenderable .builder() .setSource(context, Uri.parse(model.glb)) .setIsFilamentGltf(true) .build () .thenAccept {} - person SGTCheung; 12.07.2020

Вы можете получить доступ к модели GLB из активов следующим образом: приведенный ниже пример — Kotlin, и он протестирован с mSceneform 1.18, который аналогичен Sceneform 1.16.

        //Build the renderable - this uses the new to Sceneform 1.16 glb model format
        val modelFilePath =  getFileFromAssets(this, "yourModel.glb").absolutePath
        ModelRenderable.builder()
                .setSource(
                        this,
                        Uri.parse(
                                modelFilePath))
                .setIsFilamentGltf(true)
                .build()
                .thenAccept(
                        Consumer { modelRenderable: ModelRenderable ->
                            //Add anything you want to do here....
                            Log.d(TAG,"Model loaded")
                        })
                .exceptionally( Function<Throwable, Void?> { throwable: Throwable? ->
                            //Add anything you want to do here e.g.:
                            Log.d(TAG, "ModelRenderable.builder exception: " + throwable)
                            null
                        })
person Mick    schedule 31.12.2020