我正在加载mp3文件,以便在基于AndEngine的Android游戏中播放。当我将游戏打包为APK时,资源文件夹中的mp3音频会抛出错误“无法打开作为文件描述符;它可能已被压缩。”
然而,当我使用run>运行游戏时Eclipse中的按钮(MOTODEV Studio 3.0.2),应用程序打包,部署到设备,游戏有声音。在设备上完美运行。
如果我使用“导出Android应用程序”打包应用程序,该应用程序会创建已准备好在Android电子市场中部署的已签名APK,然后在设备上安装该APK,则游戏功能完全除了声音不播放并抛出以下错误:
> 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)
我尝试将APK部署到Kindle Fire,Motorolo Droid和Motorolo Droid 2 Global。游戏适用于所有这些设备,但没有声音。
音频作为mp3文件存储在名为Sound的Assets下的文件夹中。示例文件名是“music-a-nebulas-promise.mp3”。我已经尝试重命名其中一个文件“simple.mp3”,担心命名中不允许破折号,但它没有任何区别。
加载音频的代码如下所示,请注意,当我使用MOTODEV Studio运行应用程序时,声音会完美播放。只有当我尝试将应用程序导出为APK并安装它时,我才会收到有关压缩的上述错误:
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;
}
初始化音频的AndEngine方法:
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;
}
我尝试将mp3文件转换为ogg和wav。 ogg和wav都会抛出与mp3文件相同的错误。
由于游戏声音在我使用Eclipse运行或调试时起作用,似乎将最终导出步骤作为罪魁祸首。我看过一些帖子,建议控制构建过程以防止压缩Assets文件夹中的文件,但我不知道如何从MOTODEV Studio中完成。
我还看到过建议将mp3音频存储在res / raw文件夹中的帖子,但是因为从Eclipse运行时,Assets文件夹中的音频播放,所以在打包为APK时它似乎也可以工作。
我目前使用Android SDK Tools v.15和Android SDK Platform-tools v.9定位Android SDK 13级(Android 3.2) - 因此认为它可能与SDK工具有关,我更新了SDK到v.16和平台工具到v.10但是没有解决问题。
答案 0 :(得分:1)
在调试时从Eclipse(或MOTODEV Studio)内部运行应用程序的原因是它不会通过导出时发生的完整路径。我没有在我面前的SDK构建流程图,但有一个在那里。我确定有一些探测Ant脚本会暴露正在发生的事情。
我这样说是因为没有什么MOTODEV Studio与构建过程中的Eclipse有什么不同。虽然有一个单独的“使用MOTODEV Studio导出”菜单项,但所有发生的事情都是预先填充了一些字段,以便于访问证书库。否则,导出过程与Eclipse + ADT相同(就是这样)。
答案 1 :(得分:1)
问题似乎与AndEngine的MusicFactory.java中的mediaPlayer.prepare()方法有关。我只是注释掉了第91行(如下面的代码snipet),并且没有任何例外地加载了MP3资源。我认为资产加载方法也可以做到这一点。
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;
}
答案 2 :(得分:0)
您可以将音频文件放在“RAW”文件夹中,然后通过以下方式播放:
mPlayer2= MediaPlayer.create(this, R.raw.MUSICTAG);
mPlayer2.start();
这样,压缩应该没有问题。