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类播放音频