我正在加载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工具v.15和Android SDK平台工具v.9定位Android SDK 13级(Android 3.2) – 因此认为它可能与SDK工具有关,我将SDK更新为v. 16和v.10的平台工具,但没有解决问题.
解决方法:
在调试时从Eclipse(或MOTODEV Studio)内部运行应用程序的原因是它不会通过导出时发生的完整路径.我没有在我面前的SDK构建流程图,但有一个在那里.我确定有一些探测Ant脚本会暴露正在发生的事情.
我这样说是因为没有什么MOTODEV Studio与构建过程中的Eclipse有什么不同.虽然有一个单独的“使用MOTODEV Studio导出”菜单项,但所有发生的事情都是预先填充了一些字段,以便于访问证书库.否则,导出过程与Eclipse ADT相同(就是这样).