我该如何修复音频? (优先化)

时间:2015-11-25 05:13:01

标签: java android multithreading android-activity optimization

当同时播放两个音频时...声音正在取消。我该如何解决这个奇怪的现象?

我有一些代码,其中有按钮上的音频按下音频,间隔十秒(在后台服务中)。我有以下代码来播放十秒间隔时停止按钮音频,它工作正常:

public static void myPop(Context context){
    AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    if(!manager.isMusicActive()) {       //Only if there isn't any other audio playing
        MediaPlayer pop = MediaPlayer.create(context, R.raw.pop);
        pop.start();
    }
    else{
        Log.v(TAG, "Audio is already playing");
    }
}

这样可以正常工作,并且可以停止播放(弹出)一个音频以播放其他音频(来自后台服务的音频)。现在,当他们同时玩的时候我就会遇到问题。例如,当我点击完全时的按钮,同时将来自后台服务的音频即将开始。当它们同时播放时,音频就会被切断

有没有办法优先考虑后台服务音频?不知何故说:如果两个音频片段在同一时间开始,我想让后台服务音频播放。

直观地思考:

enter image description here

https://upload.wikimedia.org/wikipedia/en/4/49/Preference_example.jpg

我想说,如果我可以选择苹果和橘子,那就摘苹果。 AKA如果我同时播放两个音频播放器,请选择一个(苹果)。

感谢您的帮助,

Ruchir

2 个答案:

答案 0 :(得分:2)

您可能有竞争条件。在这三行

1    if(!manager.isMusicActive()) {
2        MediaPlayer pop = MediaPlayer.create(context, R.raw.pop);
3        pop.start();

在第1行和第3行之间,其他玩家有机会获得媒体播放器并开始播放,特别是如果第2行很慢的话。

我建议制作一个两个玩家都可以访问的媒体播放器(即在别处创建“MediaPlayer pop”并分享它),或者找到另一种方法来同步不同的玩家。也许在比赛前发出一个停止,而不是检查比赛状态。

答案 1 :(得分:0)

当其他玩家开始或暂停时,您可以使用代码播放或暂停音频。

   AudioManager.OnAudioFocusChangeListener afChangeListener =
    new AudioManager.OnAudioFocusChangeListener() {
        public void onAudioFocusChange(int focusChange) {
            if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {
                // Pause playback
            } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
                // Resume playback
            } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
                am.abandonAudioFocus(afChangeListener);
                // Stop playback
            }
        }
    };

更多的参考 http://developer.android.com/training/managing-audio/audio-focus.html