android audio andengine assets motodev-studio

El audio Mp3 en la carpeta de Android Assets falla al jugar desde un APK firmado y zip-alineado



andengine motodev-studio (3)

Estoy cargando archivos mp3 para jugar en un juego de Android basado en AndEngine. Cuando paquete mi juego como APK, el audio mp3 en la carpeta de activos arroja el error "no se puede abrir como un descriptor de archivo, probablemente esté comprimido".

Sin embargo, cuando ejecuto el juego usando el botón ejecutar> en Eclipse (MOTODEV Studio 3.0.2), la aplicación se empaqueta, se implementa en un dispositivo y el juego tiene sonido. Funciona perfectamente en un dispositivo.

Si empaqueté la aplicación usando "Exportar aplicación de Android", que crea una APK firmada lista para implementar en Android Market y luego instala esa APK en un dispositivo, el juego funciona perfectamente excepto que el sonido no se reproduce y arroja el siguiente error:

> 02-02 20:42:31.433: E/AndEngine(1925): AndEngine 02-02 20:42:31.433: > E/AndEngine(1925): java.io.FileNotFoundException: This file can not be > opened as a file descriptor; it is probably compressed 02-02 > 20:42:31.433: E/AndEngine(1925): at > android.content.res.AssetManager.openAssetFd(Native Method) 02-02 > 20:42:31.433: E/AndEngine(1925): at > android.content.res.AssetManager.openFd(AssetManager.java:330) 02-02 > 20:42:31.433: E/AndEngine(1925): at > org.anddev.andengine.audio.music.MusicFactory.createMusicFromAsset(MusicFactory.java:75) > 02-02 20:42:31.433: E/AndEngine(1925): at > com.snoffleware.android.roshambomb.PlayLevelActivity.onLoadResources(PlayLevelActivity.java:255) > 02-02 20:42:31.433: E/AndEngine(1925): at > org.anddev.andengine.ui.activity.BaseGameActivity.doResume(BaseGameActivity.java:168) > 02-02 20:42:31.433: E/AndEngine(1925): at > org.anddev.andengine.ui.activity.BaseGameActivity.onWindowFocusChanged(BaseGameActivity.java:85) > 02-02 20:42:31.433: E/AndEngine(1925): at > com.android.internal.policy.impl.PhoneWindow$DecorView.onWindowFocusChanged(PhoneWindow.java:2012) > 02-02 20:42:31.433: E/AndEngine(1925): at > android.view.View.dispatchWindowFocusChanged(View.java:3924) 02-02 > 20:42:31.433: E/AndEngine(1925): at > android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:659) > 02-02 20:42:31.433: E/AndEngine(1925): at > android.view.ViewRoot.handleMessage(ViewRoot.java:1968) 02-02 > 20:42:31.433: E/AndEngine(1925): at > android.os.Handler.dispatchMessage(Handler.java:99) 02-02 > 20:42:31.433: E/AndEngine(1925): at > android.os.Looper.loop(Looper.java:130) 02-02 20:42:31.433: > E/AndEngine(1925): at > android.app.ActivityThread.main(ActivityThread.java:3683) 02-02 > 20:42:31.433: E/AndEngine(1925): at > java.lang.reflect.Method.invokeNative(Native Method) 02-02 > 20:42:31.433: E/AndEngine(1925): at > java.lang.reflect.Method.invoke(Method.java:507) 02-02 20:42:31.433: > E/AndEngine(1925): at > com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850) > 02-02 20:42:31.433: E/AndEngine(1925): at > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 02-02 > 20:42:31.433: E/AndEngine(1925): at > dalvik.system.NativeStart.main(Native Method)

Intenté implementar el APK en Kindle Fire, Motorolo Droid y Motorolo Droid 2 Global. El juego funciona en todos estos dispositivos pero sin sonido.

El audio se almacena como archivos mp3 en una carpeta en Assets llamada Sound. Un nombre de archivo de ejemplo es "music-a-nebulas-promise.mp3". He intentado cambiar el nombre de uno de los archivos, "simple.mp3", preocupado de que los guiones no estén permitidos en la nomenclatura, pero no hicieron ninguna diferencia.

El código que carga el audio es el siguiente y tenga en cuenta que cuando ejecuto la aplicación con MOTODEV Studio, el sonido se reproduce perfectamente. Solo cuando intento exportar la aplicación como APK e instalarlo obtengo el error de compresión mencionado anteriormente:

SoundFactory.setAssetBasePath("sound/"); MusicFactory.setAssetBasePath("sound/"); try { if (!level.getMusic().equals("")) { backgroundMusic = MusicFactory.createMusicFromAsset(this.mEngine.getMusicManager(), this, level.getMusic()); backgroundMusic.setLooping(true); } else { // music is turned on but there is no music file -- protect // against crash isMusic = false; } } catch (final IOException e) { Debug.e(e); // music is turned on but the music file was not found -- protect // against crash isMusic = false; } try { collisionSound = SoundFactory.createSoundFromAsset(this.mEngine.getSoundManager(), this, "sfx-collision.mp3"); portalSound = SoundFactory.createSoundFromAsset(this.mEngine.getSoundManager(), this, "sfx-portal-activated.mp3"); winningSound = SoundFactory.createSoundFromAsset(this.mEngine.getSoundManager(), this, "sfx-winning.mp3"); losingSound = SoundFactory.createSoundFromAsset(this.mEngine.getSoundManager(), this, "sfx-losing.mp3"); } catch (final IOException e) { Debug.e(e); isSound = false; }

El método AndEngine que inicializa el audio:

public static Music createMusicFromAsset(final MusicManager pMusicManager, final Context pContext, final String pAssetPath) throws IOException { final MediaPlayer mediaPlayer = new MediaPlayer(); final AssetFileDescriptor assetFileDescritor = pContext.getAssets().openFd(MusicFactory.sAssetBasePath + pAssetPath); mediaPlayer.setDataSource(assetFileDescritor.getFileDescriptor(), assetFileDescritor.getStartOffset(), assetFileDescritor.getLength()); mediaPlayer.prepare(); final Music music = new Music(pMusicManager, mediaPlayer); pMusicManager.add(music); return music; }

Intenté convertir los archivos mp3 a ogg y wav. Tanto ogg como wav arrojan el mismo error que los archivos mp3.

Dado que el sonido del juego funciona cuando lo ejecuto o lo depuro usando Eclipse que parece dejar el paso de exportación final como el culpable. He visto publicaciones que sugieren controlar el proceso de compilación para evitar la compresión de archivos en la carpeta de recursos, pero no estoy seguro de cómo lograr eso desde MOTODEV Studio.

También he visto publicaciones que sugieren almacenar el audio mp3 en la carpeta res / raw pero dado que el audio en la carpeta Assets se reproduce cuando se ejecuta desde Eclipse, parece que también debería funcionar cuando se empaqueta como un APK.

Detalles de la versión

Actualmente utilizo Android SDK nivel 13 (Android 3.2) con las herramientas Android SDK Tools v.15 y Android SDK Platform-tools v.9, así que pensando que podría tener algo que ver con las herramientas SDK, actualicé el SDK a v. 16 y las herramientas de plataforma a v.10 pero eso no solucionó el problema.


El motivo por el que su aplicación funciona cuando se ejecuta desde Eclipse (o MOTODEV Studio) en la depuración es que no está pasando por la ruta completa que se produce en la exportación. No tengo el gráfico del proceso de compilación del SDK frente a mí, pero hay uno por ahí. Estoy seguro de que investigar un poco los guiones Ant expondrá lo que está sucediendo.

Digo esto porque no hay nada que MOTODEV Studio diferencie de Eclipse en el proceso de compilación. Si bien existe un elemento de menú "Exportar con MOTODEV Studio" por separado, todo lo que sucede allí es que un par de campos se rellenan previamente con información para su comodidad y acceso a su tienda de certificados. De lo contrario, el proceso de exportación es el mismo que Eclipse + ADT (que es lo que es).


Puede poner los archivos de audio en la carpeta "RAW" y reproducirlos a través de:

mPlayer2= MediaPlayer.create(this, R.raw.MUSICTAG); mPlayer2.start();

De esta forma, no debería haber problemas con la compresión.


El problema parece estar relacionado con el método mediaPlayer.prepare () en MusicFactory.java de AndEngine. Acabo de comentar la línea 91 (como en el siguiente código snipet) y el recurso MP3 se cargó sin ninguna excepción. Creo que lo mismo se puede hacer con el método de carga de activos.

public static Music createMusicFromResource(final MusicManager pMusicManager, final Context pContext, final int pMusicResID) throws IOException { final MediaPlayer mediaPlayer = MediaPlayer.create(pContext, pMusicResID); **//mediaPlayer.prepare();** final Music music = new Music(pMusicManager, mediaPlayer); pMusicManager.add(music); return music; }