2015-06-20 66 views
3

這是一個適合您的好東西。Libgdx:打開外部文件時找不到文件錯誤'Internal'

我想用外部打開文件。

FileHandle dirHandel = Gdx.files.external("MyApps/skanectModel.g3db"); 
boolean isDir = Gdx.files.external("MyApps/skanectModel.g3db").exists(); 

我知道文件在那裏,布爾告訴我,實際上它在那裏。

主要問題是我得到這個錯誤。

Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error reading file: MyApps/skanectModel.png (Internal) 

我不知道爲什麼要這麼做,我沒有在尋找一個內部文件。

出於好奇,我創建了我的資產文件夾中的文件就這樣assets/MyApps/skanectModel.png和代碼運行完美,也應用程序可以在我的Android播放。

但是...我需要能夠只讀取外部。我正在爲一些朋友構建一個簡單的3D查看器,我會不時地發送給他們3D模​​型。

這裏是代碼的副本:

package com.mygdx.game; 

import com.badlogic.gdx.ApplicationListener; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.assets.loaders.ModelLoader; 
import com.badlogic.gdx.Files; 
import com.badlogic.gdx.files.FileHandle; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.PerspectiveCamera; 
import com.badlogic.gdx.graphics.g3d.Environment; 
import com.badlogic.gdx.graphics.g3d.Model; 

import com.badlogic.gdx.graphics.g3d.ModelBatch; 
import com.badlogic.gdx.graphics.g3d.ModelInstance; 
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute; 
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight; 
import com.badlogic.gdx.graphics.g3d.loader.G3dModelLoader; 
import com.badlogic.gdx.graphics.g3d.loader.ObjLoader; 
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController; 
import com.badlogic.gdx.math.Vector3; 
import com.badlogic.gdx.utils.UBJsonReader; 

public class MyGdxGame implements ApplicationListener { 
    public Environment environment; 
    public PerspectiveCamera cam; 
    public CameraInputController camController; 
    public ModelBatch modelBatch; 
    public Model model; 
    public ModelInstance instance; 

@Override 
public void create() { 
    environment = new Environment(); 
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 1.4f, 1.4f, 1.4f, 5f)); 
    environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f)); 

    cam = new PerspectiveCamera(75,Gdx.graphics.getWidth(),Gdx.graphics.getHeight()); 
    cam.position.set(50f, 1f, 50f); 
    cam.lookAt(0,0,0); 
    cam.near = 0.1f; 
    cam.far = 500f; 
    cam.update(); 

    modelBatch = new ModelBatch(); 
//  ModelLoader<?> loader = new ObjLoader(); 
    UBJsonReader jsonReader = new UBJsonReader(); 
    G3dModelLoader modelLoader = new G3dModelLoader(jsonReader); 

//  model = modelLoader.loadModel(Gdx.files.getFileHandle("root/MyApps/skanectModel.g3db",Files.FileType.Absolute)); 
//  model = modelLoader.loadModel(Gdx.files.getFileHandle("skanectModel.g3db",Files.FileType.External)); 

    FileHandle dirHandel = Gdx.files.external("MyApps/skanectModel.g3db"); 
    boolean isDir = Gdx.files.external("MyApps/skanectModel.g3db").exists(); 
    Gdx.app.log("is it", String.valueOf(isDir)); 
//  for (FileHandle entry: dirHandel.list()){ 
//   Gdx.app.log("Path",entry.toString()); 
//  } 
    model = modelLoader.loadModel(dirHandel); 
//  model = modelLoader.loadModel(Gdx.files.getFileHandle("skanectModel.g3db",Files.FileType.External)); 
    instance = new ModelInstance(model); 
    instance.transform.rotate(90f,0f,0,-90f); 


    camController = new CameraInputController(cam); 
    Gdx.input.setInputProcessor(camController); 
} 

@Override 
public void render() { 
    camController.update(); 

    Gdx.gl.glViewport(0,0,Gdx.graphics.getWidth(),Gdx.graphics.getHeight()); 
    Gdx.gl.glClearColor(.5f,1,1,1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

    modelBatch.begin(cam); 
    modelBatch.render(instance, environment); 
    modelBatch.end(); 
} 

@Override 
public void dispose() { 
    modelBatch.dispose(); 
    model.dispose(); 
} 

@Override 
    public void resize(int width, int height) { 
} 

@Override 
    public void pause() { 
} 

@Override 
    public void resume() { 
} 
} 

請幫助...!

編輯: 下面是完整的錯誤日誌:

06-20 10:00:47.918 3205-3221/com.mygdx.game.android E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 39207 
Process: com.mygdx.game.android, PID: 3205 
com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file:MyApps/skanectModel.png 
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140) 
at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98) at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:100) 
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:92) 
at com.badlogic.gdx.graphics.g3d.utils.TextureProvider$FileTextureProvider.load(TextureProvider.java:34) 
at com.badlogic.gdx.graphics.g3d.Model.convertMaterial(Model.java:290) 
at com.badlogic.gdx.graphics.g3d.Model.loadMaterials(Model.java:266) 
at com.badlogic.gdx.graphics.g3d.Model.load(Model.java:107) 
at com.badlogic.gdx.graphics.g3d.Model.<init>(Model.java:102) 
at com.badlogic.gdx.assets.loaders.ModelLoader.loadModel(ModelLoader.java:54) 
at com.badlogic.gdx.assets.loaders.ModelLoader.loadModel(ModelLoader.java:69) 
at com.mygdx.game.MyGdxGame.create(MyGdxGame.java:65) 
at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:241) 
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520) 
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248) 
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error reading file: MyApps/skanectModel.png (Internal) 
at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:77) 
at com.badlogic.gdx.files.FileHandle.readBytes(FileHandle.java:222) 
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:137) 
at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98) 
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:100) 
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:92) 
at com.badlogic.gdx.graphics.g3d.utils.TextureProvider$FileTextureProvider.load(TextureProvider.java:34) 
at com.badlogic.gdx.graphics.g3d.Model.convertMaterial(Model.java:290) 
at com.badlogic.gdx.graphics.g3d.Model.loadMaterials(Model.java:266) 
at com.badlogic.gdx.graphics.g3d.Model.load(Model.java:107) 
at com.badlogic.gdx.graphics.g3d.Model.<init>(Model.java:102) 
at com.badlogic.gdx.assets.loaders.ModelLoader.loadModel(ModelLoader.java:54) 
at com.badlogic.gdx.assets.loaders.ModelLoader.loadModel(ModelLoader.java:69) 
at com.mygdx.game.MyGdxGame.create(MyGdxGame.java:65) 
at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:241) 
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520) 
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248) 
Caused by: java.io.FileNotFoundException: MyApps/skanectModel.png 
at android.content.res.AssetManager.openAsset(Native Method) 
at android.content.res.AssetManager.open(AssetManager.java:324) 
at android.content.res.AssetManager.open(AssetManager.java:298) 
at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:75) 
at com.badlogic.gdx.files.FileHandle.readBytes(FileHandle.java:222) 
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:137) 
at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98) 
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:100) 
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:92) 
at com.badlogic.gdx.graphics.g3d.utils.TextureProvider$FileTextureProvider.load(TextureProvider.java:34) 
at com.badlogic.gdx.graphics.g3d.Model.convertMaterial(Model.java:290) 
at com.badlogic.gdx.graphics.g3d.Model.loadMaterials(Model.java:266) 
at com.badlogic.gdx.graphics.g3d.Model.load(Model.java:107) 
at com.badlogic.gdx.graphics.g3d.Model.<init>(Model.java:102) 
at com.badlogic.gdx.assets.loaders.ModelLoader.loadModel(ModelLoader.java:54) 
at com.badlogic.gdx.assets.loaders.ModelLoader.loadModel(ModelLoader.java:69) 
at com.mygdx.game.MyGdxGame.create(MyGdxGame.java:65) 
at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphi cs.java:241) 
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520) 
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248) 

******編輯***** 從MadEqua迅速提醒後,這是我如何實現修復。

FileHandle dirHandel = Gdx.files.external("MyApps/skanectModel.g3db"); 
myT = new TextureProvider() { 
@Override 
public Texture load(String fileName) { 
Texture result = new Texture(Gdx.files.external(fileName)); 
result.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 
result.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat); 
return result; 
    } 
}; 
myT.load("Myapps/skanectModel.png"); 
model = modelLoader.loadModel(dirHandel,myT); 

回答

2

在仔細查看堆棧跟蹤之後,似乎該模型會自行正確加載其加載。在com.badlogic.gdx

在 com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:75) :

問題加載模型的紋理時出現.files.FileHandle.readBytes(FileHandle.java:222)at com.badlogic。gdx.graphics.Pixmap。(Pixmap.java:137)at com.badlogic.gdx.graphics.TextureData $ Factory.loadFromFile(TextureData.java:98) at com.badlogic.gdx.graphics.Texture。(Texture。 java:100)at com.badlogic.gdx.graphics.Texture。(Texture.java:92)at com.badlogic.gdx.graphics.g3d.utils.TextureProvider $ FileTextureProvider.load(TextureProvider.java:34) 在com.badlogic.gdx.graphics.g3d.Model.convertMaterial(Model.java:290) 在com.badlogic.gdx.graphics.g3d.Model.loadMaterials(Model.java:266)

我相信libGDX試圖從錯誤的位置(內部位置,解釋你得到的錯誤)加載紋理文件。

我從來沒有與libDGX模型功能的工作,但我認爲你應該使用這種方法來代替:loadModel(FileHandle fileHandle, TextureProvider textureProvider)

,並通過在加載來自外部文件夾中的紋理文件TextureProvider。 (並確保紋理文件在那裏)。

通過查看FileTextureProvider,應該很容易實現自定義TextureProvider

+0

我會吻你,如果我可以.... !!!奇蹟般有效。這個是我做過的: FileHandle dirHandel =紋理結果=新紋理(Gdx.files.external(fileName));紋理結果=新紋理(Gdx.files.external(fileName));紋理結果=新紋理(Gdx.files.external(fileName)); result.setFilter(Texture.TextureFilter.Linear,Texture.TextureFilter.Linear); result.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat); \t \t \t \t返回結果; \t \t \t} \t \t}; myT.load(「Myapps/skanectModel.png」); model = modelLoader.loadModel(dirHandel,myT); –

+0

是的,它也花了我一段時間才明白這是一個紋理問題。順便說一下,這條線什麼都不做,可以刪除:'myT.load(「Myapps/skanectModel.png」);'。負載在ModelLoader內部調用。不過,沒有吻。 ;-) – MadEqua

1

File handling Libgdx Wiki

從他們的維基

外部文件的路徑是相對於Android和在桌面系統中當前用戶的主目錄中的SD卡根目錄。

本地文件存儲與應用程序的桌面上的根目錄或工作目錄,並相對於Android上的應用程序的內部(私有)存儲。請注意,桌面上的本地和內部大部分是相同的。

因此,如果您的文件在項目根目錄下,您應該使用本地而不是外部。你能提供更多的信息,如測試平臺。

+0

感謝您的重播。我很清楚libgdx的文件處理。 但我試圖從android使用外部文件'root'加載模型,但libgdx不斷在內部查找紋理,而不是在外部文件的相同目錄中。 請閱讀我的原文,以便更好地瞭解它的內容。 –