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?