Я загружаю mp3-файлы, чтобы играть в Android-игру на основе AndEngine.Когда я упаковываю свою игру как APK, mp3-файл в папке активов выдает ошибку «невозможно открыть как дескриптор файла; возможно, он сжат».
Однако, когда я запускаю игру с помощью команды run> Кнопка в Eclipse (MOTODEV Studio 3.0.2), приложение упаковано, развернуто на устройстве и в игре есть звук.Отлично работает на устройстве.
Если я упакую приложение с помощью «Экспортировать приложение Android», которое создаст подписанный APK, готовый для развертывания в Android Market, а затем установит этот 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-файлов в папке Assets под названием Sound.Примером имени файла является «music-a-nebulas-обещание.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, который, по-видимому, оставляет последний шаг экспорта в качестве виновника.Я видел сообщения, в которых предлагается контролировать процесс сборки, чтобы предотвратить сжатие файлов в папке «Ресурсы», но я не уверен, как этого добиться в MOTODEV Studio.
Я также видел сообщения, в которых предлагается хранить аудиофайл в формате mp3.в папке res / raw, но так как звук в папке Assets воспроизводится при запуске из Eclipse, кажется, что он также должен работать при упаковке в виде APK.
Сведения о версии
Я в настоящее время нацеливаюсьAndroid SDK level 13 (Android 3.2) с использованием Android SDK Tools v.15 и Android SDK Platform-tools v.9 - поэтому, подумав, что это может иметь какое-то отношение к инструментам SDK, я обновил SDK до v.16 и платформыинструменты для v.10, но это не решило проблему.