2

I'm instantiating a Pixmap from a FileHandle that points to a png file in an OBB file from Google's APK Expansion Library, mounted using StorageManager. The OBB file is encrypted.

This works fine on devices I tested running Android 5.1 and 4.3 without a physical SD Card, but fails to work on a device running Android 4.4.1 with a physical SD card. I'm getting:

Error loading pixmap: decoder init failed for stream

Here's the whole stack trace:

08-08 15:01:18.839  30228-30285/com.yasesprox.solarball.android W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x41bbcd58)
    --------- beginning of /dev/log/system
08-08 15:01:18.859  30228-30285/com.yasesprox.solarball.android E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 3615
    Process: com.yasesprox.solarball.android, PID: 30228
    com.badlogic.gdx.utils.GdxRuntimeException: com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: /mnt/obb/e0fb6be85a09d3afdfb4453fcca775e3/stage_1/screenshot.png
            at com.badlogic.gdx.assets.AssetManager.handleTaskError(AssetManager.java:536)
            at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:356)
            at com.yasesprox.solarball.extensions.SolarBallStage.loading(SolarBallStage.java:45)
            at com.yasesprox.solarball.misc.LoadingStage.update(LoadingStage.java:36)
            at com.yasesprox.solarball.misc.LoadingStage.act(LoadingStage.java:46)
            at com.yasesprox.solarball.extensions.SolarBallGame.render(SolarBallGame.java:101)
            at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:422)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
     Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: /mnt/obb/e0fb6be85a09d3afdfb4453fcca775e3/stage_1/screenshot.png
            at com.badlogic.gdx.graphics.Pixmap.(Pixmap.java:140)
            at com.yasesprox.solarball.data.StageDataProvider.instantiateScreenshot(StageDataProvider.java:41)
            at com.yasesprox.solarball.data.StageDataProvider.(StageDataProvider.java:24)
            at com.yasesprox.solarball.data.StageDataProviderLoader.loadSync(StageDataProviderLoader.java:23)
            at com.yasesprox.solarball.data.StageDataProviderLoader.loadSync(StageDataProviderLoader.java:11)
            at com.badlogic.gdx.assets.AssetLoadingTask.handleAsyncLoader(AssetLoadingTask.java:123)
            at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:89)
            at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:477)
            at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:354)
            at com.yasesprox.solarball.extensions.SolarBallStage.loading(SolarBallStage.java:45)
            at com.yasesprox.solarball.misc.LoadingStage.update(LoadingStage.java:36)
            at com.yasesprox.solarball.misc.LoadingStage.act(LoadingStage.java:46)
            at com.yasesprox.solarball.extensions.SolarBallGame.render(SolarBallGame.java:101)
            at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:422)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
     Caused by: java.io.IOException: Error loading pixmap: decoder init failed for stream
            at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.(Gdx2DPixmap.java:57)
            at com.badlogic.gdx.graphics.Pixmap.(Pixmap.java:138)
            at com.yasesprox.solarball.data.StageDataProvider.instantiateScreenshot(StageDataProvider.java:41)
            at com.yasesprox.solarball.data.StageDataProvider.(StageDataProvider.java:24)
            at com.yasesprox.solarball.data.StageDataProviderLoader.loadSync(StageDataProviderLoader.java:23)
            at com.yasesprox.solarball.data.StageDataProviderLoader.loadSync(StageDataProviderLoader.java:11)
            at com.badlogic.gdx.assets.AssetLoadingTask.handleAsyncLoader(AssetLoadingTask.java:123)
            at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:89)
            at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:477)
            at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:354)
            at com.yasesprox.solarball.extensions.SolarBallStage.loading(SolarBallStage.java:45)
            at com.yasesprox.solarball.misc.LoadingStage.update(LoadingStage.java:36)
            at com.yasesprox.solarball.misc.LoadingStage.act(LoadingStage.java:46)
            at com.yasesprox.solarball.extensions.SolarBallGame.render(SolarBallGame.java:101)
            at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:422)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

I load other resources from the same place before the Pixmap and they all work fine on all devices; it's just this one Pixmap.

Also, the same exact Pixmap works fine on all devices if I load it from internal storage using Gdx.files.internal (the file being in the "assets" folder of the Android project).

What's going on?

AxiomaticNexus
  • 6,190
  • 3
  • 41
  • 61

0 Answers0