【问题标题】:Android MediaPlayer: Multiple sounds playing at the same time. My code isAndroid MediaPlayer:同时播放多个声音。我的代码是
【发布时间】:2016-03-08 14:29:38
【问题描述】:

我搜索并研究了 stackoverflow 和 google,但找不到我的问题的任何答案。我找到了其他问题和答案,但这与应用程序中保存的声音有关,但我正在创建一个从 Parse 服务器获取数据的应用程序,因此它获取 mp3 文件并在列表视图中显示这些文件,而不是在单击项目时播放该曲目。但是问题来了:当您播放一个声音并单击另一个声音时,第一个声音并没有停止,而第二个声音开始播放。 我已经尝试使用以下代码,但它只是不工作。 这是我的代码:

play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final MediaPlayer mediaPlayer = new MediaPlayer();
                final MediaPlayer scndmediaPlayer = new MediaPlayer();
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                scndmediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                if (mediaPlayer.isPlaying()) {
                    Toast.makeText(getContext(), "First is playing", Toast.LENGTH_SHORT).show();
                    try {
                        mediaPlayer.stop();
                        scndmediaPlayer.setDataSource(audioFileURL);
                        scndmediaPlayer.prepare();
                        scndmediaPlayer.start();
                        //soundtoolbar.setTitle(name);
                    } catch (IllegalArgumentException e1) {
                        e1.printStackTrace();
                    } catch (SecurityException e1) {
                        e1.printStackTrace();
                    } catch (IllegalStateException e1) {
                        e1.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    try {
                        if (scndmediaPlayer.isPlaying()){
                            scndmediaPlayer.stop();
                        }
                        Toast.makeText(getContext(), "First is starting", Toast.LENGTH_SHORT).show();
                        mediaPlayer.setDataSource(audioFileURL);
                        mediaPlayer.prepare();
                        mediaPlayer.start();
                        soundtoolbar.setTitle(name);
                    } catch (IllegalArgumentException e1) {
                        e1.printStackTrace();
                    } catch (SecurityException e1) {
                        e1.printStackTrace();
                    } catch (IllegalStateException e1) {
                        e1.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                playPause.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (mediaPlayer.isPlaying() || scndmediaPlayer.isPlaying()) {
                            mediaPlayer.pause();
                            scndmediaPlayer.pause();
                            playPause.setBackground(getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp));
                        } else {
                            mediaPlayer.start();
                            scndmediaPlayer.start();
                            playPause.setBackground(getContext().getDrawable(R.drawable.ic_pause_white_24dp));
                        }
                    }
                });
            }

        });

我使用上面的代码创建了 2 个媒体播放器,当用户单击播放按钮时,它首先检查是否有任何播放器正在运行。 我正在尝试实现以下目标:当用户单击播放按钮时,它会检查 (1st) mediaPlayer 是否正在运行。如果它正在运行,它只需停止它并启动(第二个)scndmediaPlayer,反之亦然......如果第二个正在播放,它会停止并启动第一个。所以它会创建一个循环:第一个正在播放?用户首先单击另一个按钮停止。第二个发射。用户单击另一个按钮。首先是玩?没有。第二个在玩吗?是的。停止第二个并启动第一个。 但是在我的代码中找不到问题所在。 请帮我解决一下这个。我试图从 2 天开始解决它,但我无法... 谢谢:)

编辑:我尝试使用一个 MediaPlayer 并执行以下操作:检查 mediaplayer 是否正在播放!不,它没有播放。启动它。用户再次单击该按钮,它会停止媒体播放器并使用新的 audioFileUrl 启动它。但。 MediaPlayer 忘记了它正在播放。似乎它只是开始轨道而不是忘记并检查它是否是真的我设置了一个 Toast:当媒体播放器没有播放 toast 节目并且每次我点击列表中的轨道时它都会显示,这意味着它忘记了它有一个正在播放的曲目...

编辑 2: 我设法做到了以下几点:它播放曲目。用户单击另一个轨道。它停止媒体播放器,但不播放新曲目。用户再次单击。它播放新曲目。用户点击新曲目,应用崩溃...

编辑 3: 发布我的整个班级:

public class MyAdapter extends ParseQueryAdapter<ParseObject> {

public Button playPause, next, previous;
public Toolbar soundtoolbar;
boolean isPlaying = false;
public MyAdapter(Context context) {

    super(context, new ParseQueryAdapter.QueryFactory<ParseObject>() {
        public ParseQuery create() {
            ParseQuery query = new ParseQuery("MyClass");
            query.orderByDescending("createdAt");
            return query;
        }
    });
}


@Override
public View getItemView(final ParseObject object, View v, final ViewGroup parent) {

    if (v == null) {
        v = View.inflate(getContext(), R.layout.activity_audio_files_item, null);
    }
    super.getItemView(object, v, parent);

    final Button play = (Button) v.findViewById(R.id.play);
    playPause = TabFragment1.playPause;
    next = TabFragment1.next;
    previous = TabFragment1.previous;
    soundtoolbar = TabFragment1.soundtoolbar;
    final ParseFile descr = object.getParseFile("audiofile");
    final String name = object.getString("name");
    final String audioFileURL = descr.getUrl();
    final SlidingUpPanelLayout slidingUpPanelLayout = TabFragment1.spanel;
    play.setText(name);
    final MediaPlayer mediaPlayer = new MediaPlayer();
    play.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                if (isPlaying != true) {
                Toast.makeText(getContext(), name+" is playing", Toast.LENGTH_SHORT).show();
                try {
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setDataSource(audioFileURL);
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            soundtoolbar.setTitle(name);
                            slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
                            mediaPlayer.start();
                            isPlaying = true;
                        }
                    });
                } catch (IllegalArgumentException e1) {
                    e1.printStackTrace();
                } catch (SecurityException e2) {
                    e2.printStackTrace();
                } catch (IllegalStateException e3) {
                    e3.printStackTrace();
                } catch (IOException e4) {
                    e4.printStackTrace();
                } catch (NullPointerException e5) {
                    e5.printStackTrace();
                }
            } else {
                mediaPlayer.stop();
                Toast.makeText(getContext(), "Starting "+name, Toast.LENGTH_SHORT).show();
                try {
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setDataSource(audioFileURL);
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            soundtoolbar.setTitle(name);
                            slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
                            mediaPlayer.start();
                        }
                    });
                } catch (IllegalArgumentException e1) {
                    e1.printStackTrace();
                } catch (SecurityException e2) {
                    e2.printStackTrace();
                } catch (IllegalStateException e3) {
                    e3.printStackTrace();
                } catch (IOException e4) {
                    e4.printStackTrace();
                } catch (NullPointerException e5){
                    e5.printStackTrace();
                }
            }
            playPause.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                        playPause.setBackground(getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp));
                    } else {
                        mediaPlayer.start();
                        playPause.setBackground(getContext().getDrawable(R.drawable.ic_pause_white_24dp));
                    }
                }
            });
        }

    });
    return v;
}
}

请有人帮忙...

【问题讨论】:

    标签: android audio parse-platform media-player


    【解决方案1】:

    我建议您查看 SoundPool 。这会帮助你。还有一个,可能是您将媒体网址放入数组或类似的东西。并使用一个 mediaPlayer 顺便说一句,您将避免两个 mediaPlayer 并避免内存泄漏。

    http://developer.android.com/reference/android/media/SoundPool.html

    【讨论】:

    • 我对 SoundPool 不熟悉,所以我想继续使用 MediaPlayer。我尝试使用一个 MediaPlayer 并执行以下操作:检查 mediaplayer 是否正在播放!不,它没有播放。启动它。用户再次单击该按钮,它会停止媒体播放器并使用新的 audioFileUrl 启动它。但。 MediaPlayer 忘记了它正在播放。似乎它只是开始轨道而不是忘记并检查它是否是真的我设置了一个 Toast:当媒体播放器没有播放 toast 节目并且每次我点击列表中的轨道时它都会显示,这意味着它忘记了它有一个轨道正在播放...
    • 我遇到了与您类似的 mediaPlayer 问题。然后我将视图更改为我的代码。也许你会使用一个密钥来存储 mediaPlayer 状态,然后检查它。
    • 请检查我的编辑 3. 我发布了我的整个课程。也许现在它很容易理解......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多