Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复音频?(优先次序)_Java_Android_Multithreading_Android Activity_Optimization - Fatal编程技术网

Java 如何修复音频?(优先次序)

Java 如何修复音频?(优先次序),java,android,multithreading,android-activity,optimization,Java,Android,Multithreading,Android Activity,Optimization,当同时播放两个音频时…声音将被抵消。如何修复这种奇怪的现象? 我有一些代码,其中有音频按钮点击和音频,间隔10秒(在后台服务中)。我有以下代码在播放10秒间隔时停止按钮音频,并且工作正常: public static void myPop(Context context){ AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); if(!manager.isMusi

当同时播放两个音频时…声音将被抵消。如何修复这种奇怪的现象?

我有一些代码,其中有音频按钮点击音频,间隔10秒(在后台服务中)。我有以下代码在播放10秒间隔时停止按钮音频,并且工作正常:

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");
    }
}
这可以正常工作,它会停止播放一个音频(pop),让另一个音频播放(来自后台服务的音频)。现在,当他们同时打球时,我就明白了问题所在。例如,当我在后台服务的音频即将启动的同时,在准确地点击按钮时。当它们同时播放时,音频就会被切断

有没有办法优先选择后台服务音频?不知怎么说:如果两个音频片段同时启动,我想让后台服务音频播放。

要直观地思考这一点:

()

我想说,如果我可以在苹果和桔子之间选择,那就摘苹果吧。如果我有两台音频播放器同时播放,请选择一台(苹果)。

谢谢你的帮助


Ruchir

您可能有比赛条件。在这三行中

1    if(!manager.isMusicActive()) {
2        MediaPlayer pop = MediaPlayer.create(context, R.raw.pop);
3        pop.start();
在第1行和第3行之间,另一个播放器有机会获得媒体播放器并开始播放,特别是在第2行速度较慢的情况下


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

当其他播放器启动或暂停时,您可以使用代码播放或暂停音频

   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
            }
        }
    };
更多参考资料

您介意提供一个如何做到这一点的示例吗?我不知道怎么做,因为这两个媒体播放器属于两个不同的类别…你介意提供一个如何做到这一点的例子吗?我不知道怎么做,因为这两个媒体播放器在两个不同的班级。。。