简体   繁体   English

Android MediaPlayer背景音乐线程随机停止

[英]Android MediaPlayer background music thread randomly stops

I have a single activity game while playing (after login and character selection).我在玩的时候有一个单一的活动游戏(在登录和角色选择之后)。 My sound pool for SFX works great, but my background music randomly stops playing.我的 SFX 声音池效果很好,但我的背景音乐随机停止播放。 I tried to add in setOnErrorListener, but never saw anything there.我尝试添加 setOnErrorListener,但从未在那里看到任何东西。 I am wondering if the thread is being garbage collected?我想知道线程是否正在被垃圾收集?

When you are in different towns or wilderness the music changes and that is checked here: .currentPlayingMusicFilename.equals(shortFilename), If you stay in the same music area.当您在不同的城镇或荒野时,音乐会发生变化,请在此处检查:.currentPlayingMusicFilename.equals(shortFilename),如果您留在同一音乐区。 randomly the music stops looping.随机音乐停止循环。

I have read so many posts on here and google and can't find the "proper" way to play game background music.我在这里和谷歌上阅读了很多帖子,找不到播放游戏背景音乐的“正确”方式。 I've tried soundpool, but they are over 1MB, saw many things saying not to do service, and having an issue with this approach.我尝试过 soundpool,但它们超过 1MB,看到很多东西说不提供服务,并且这种方法存在问题。 Any help is greatly appreciated.任何帮助是极大的赞赏。

I am leaving in the "SFX" portion in case that code can help anyone and provide a full picture.我将留在“SFX”部分,以防该代码可以帮助任何人并提供完整的图片。

public static void playSoundOrMusic(final String shortFilename, final String type, double distanceFactor) {
    String fullFilename = "";

    if (type.equals("SFX")){
        fullFilename = "res/sounds/sfx/" + shortFilename;
    } else if (type.equals("MUSIC")){
        if (mp3MUSICPlayer != null && mp3MUSICPlayer.isPlaying() && !currentPlayingMusicFilename.equals(shortFilename)){
            mp3MUSICPlayer.stop();
        }
        fullFilename = "res/sounds/music/" + shortFilename;
    }

    float volumeManipulation = 1.0f;
    if (type.equals("SFX")){
        int sfxVolume = MyCommandReceiver.GetSharedPreferences().getInt(MyCommandReceiver.GetStringById(R.string.pref_general_sfx_volume_key), 100);
        sfxVolume *= distanceFactor;
        volumeManipulation = (float) (sfxVolume / 100.0);
        //volumeManipulation = (float) (1 - (Math.log(MAX_VOLUME - sfxVolume) / Math.log(MAX_VOLUME)));
        LoggerWrite("v", TAG, "sfxVolume: " + volumeManipulation);
    } else if (type.equals("MUSIC")){
        int musicVolume = MyCommandReceiver.GetSharedPreferences().getInt(MyCommandReceiver.GetStringById(R.string.pref_general_music_volume_key), 100);
        volumeManipulation = (float) (musicVolume / 100.0);
        //volumeManipulation = (float) (1 - (Math.log(MAX_VOLUME - musicVolume) / Math.log(MAX_VOLUME)));
        LoggerWrite("v", TAG, "musicVolume: " + volumeManipulation);
    }
    final float finalVolume = volumeManipulation;

    if (MyCommandReceiver.GetActiveActivity() == null){ //if not yet in Activity
        return;
    }
    try {
        Uri myUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename));
        if (type.equals("SFX")){
            if (!soundPoolIds.containsKey(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename)){ //not yet in soundpool
                int soundId = soundPool.load(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename, 1);
                soundPoolIds.put(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename, soundId);
                //play it manually one time
                mp3SFXPlayer = new MediaPlayer();
                mp3SFXPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mp3SFXPlayer.setVolume(finalVolume, finalVolume);
                mp3SFXPlayer.setDataSource(MyCommandReceiver.GetActiveActivity(), myUri);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            mp3SFXPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                                @Override
                                public void onPrepared(MediaPlayer mp) {
                                    mp3SFXPlayer.start();
                                }
                            });
                            mp3SFXPlayer.prepare();
                        } catch (Exception ex) {
                            GameActivity.LoggerWrite("e", TAG, "Sound(sfx) playing issue" + ex);
                        }
                    }
                }).start();
            } else { //already in soundpool - play it
                soundPool.play(soundPoolIds.get(Environment.getExternalStorageDirectory() + "/KisnardOnline/" + fullFilename), finalVolume, finalVolume, 0, 0, 1);
            }
        } else if (type.equals("MUSIC")){
            if (!currentPlayingMusicFilename.equals(shortFilename)){
                mp3MUSICPlayer = new MediaPlayer();
                mp3MUSICPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mp3MUSICPlayer.setVolume(finalVolume, finalVolume);
                mp3MUSICPlayer.setDataSource(MyCommandReceiver.GetActiveActivity(), myUri);
            }
        }
    } catch (Exception e) {
        GameActivity.LoggerWrite("e", TAG, "Sound file issue" + e);
    }

    if (type.equals("MUSIC") && !currentPlayingMusicFilename.equals(shortFilename)){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    mp3MUSICPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            currentPlayingMusicFilename = shortFilename;
                            mp3MUSICPlayer.start();
                        }
                    });
                    mp3MUSICPlayer.prepare();
                    mp3MUSICPlayer.setLooping(true);
                } catch (Exception ex) {
                    GameActivity.LoggerWrite("e", TAG, "Sound(music) playing issue" + ex);
                }
            }
        }).start();
    }
}

Here is how I solved this as it does not seem there is an answer out there to why it dies randomly.这是我解决这个问题的方法,因为它似乎没有答案为什么它会随机死亡。

if (type.equals("MUSIC") && (!currentPlayingMusicFilename.equals(shortFilename) || !mp3MUSICPlayer.isPlaying())){
        new Thread(new Runnable() {
        ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM