Android MediaPlayer:同时播放多个声音。我的代码是

Posted

技术标签:

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

我搜索并研究了 *** 和 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;


请有人帮忙...

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

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

以上是关于Android MediaPlayer:同时播放多个声音。我的代码是的主要内容,如果未能解决你的问题,请参考以下文章

Android多媒体功能开发——使用MediaPlayer类播放音频

android中怎么样能获取正在播放的音乐名?

Android开发之SoundPool使用详解

Android MediaPlayer 播放音频

Android开发---MediaPlayer简单音乐播放器

Android - MediaPlayer/SoundPool 性能?