Mp3-аудио в папке Android Assets не воспроизводится с подписанного и выровненного по zip APK - PullRequest
2 голосов
/ 03 февраля 2012

Я загружаю 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, но это не решило проблему.

Ответы [ 3 ]

1 голос
/ 04 февраля 2012

Причина, по которой ваше приложение работает при запуске из Eclipse (или MOTODEV Studio) при отладке, заключается в том, что оно не проходит полный путь, который происходит при экспорте.Передо мной нет диаграммы процесса сборки SDK, но там есть одна.Я уверен, что некоторые исследования скриптов Ant покажут, что происходит.

Я говорю это потому, что MOTODEV Studio не отличается от Eclipse в процессе сборки.Хотя существует отдельный пункт меню «Экспорт с помощью MOTODEV Studio», все, что происходит, - это пара полей, предварительно заполненных информацией для удобства и доступа к вашему хранилищу сертификатов.В противном случае процесс экспорта аналогичен Eclipse + ADT (что и есть).

1 голос
/ 10 июля 2012

Кажется, проблема связана с методом mediaPlayer.prepare () в MusicFactory.java AndEngine.Я только что закомментировал строку 91 (как в следующем фрагменте кода), и ресурс 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;
    }
0 голосов
/ 03 февраля 2012

Вы можете поместить аудио-файлы в папку «RAW» и воспроизводить их с помощью:

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

Таким образом, не должно быть проблем со сжатием.

...