Android 使用MediaPlayer类播放音频(曲目仅第一次播放)
下面是显示曲目列表的listview适配器的代码。每个列表项都有播放和停止图标来播放和停止曲目。我遇到的问题是,只有在我单击播放按钮时,曲目才会第一次播放。之后,如果我单击停止按钮停止播放,并且尝试播放任何曲目,则不会播放。通过toast消息我发现holder.img1.setOnClickListener()方法确实会被调用,但第二次或之后单击播放按钮时不会调用onPrepared()方法。但是onPrepared()方法确实会第一次被调用,这就是为什么第一次播放曲目 如果我放置Android 使用MediaPlayer类播放音频(曲目仅第一次播放),android,audio,android-mediaplayer,Android,Audio,Android Mediaplayer,下面是显示曲目列表的listview适配器的代码。每个列表项都有播放和停止图标来播放和停止曲目。我遇到的问题是,只有在我单击播放按钮时,曲目才会第一次播放。之后,如果我单击停止按钮停止播放,并且尝试播放任何曲目,则不会播放。通过toast消息我发现holder.img1.setOnClickListener()方法确实会被调用,但第二次或之后单击播放按钮时不会调用onPrepared()方法。但是onPrepared()方法确实会第一次被调用,这就是为什么第一次播放曲目 如果我放置mMediaP
mMediaPlayer=newmediaplayer()上面问题的holder.img1.setOnClickListener的code>inside onClick()方法确实得到了解决,但单击多个播放按钮将同时开始播放我不想要的多首曲目。。
这是密码<代码>支架。img1
用于播放图标,img2
用于停止图标
声云适配器
public class SoundCloudAdapter extends BaseAdapter{
private MediaPlayer mMediaPlayer;
private Context context;
private ArrayList<SoundCloud> soundcloudList;
public SoundCloudAdapter(Context context, ArrayList<SoundCloud> soundcloudList)
{
this.context=context;
this.soundcloudList = soundcloudList;
mMediaPlayer=new MediaPlayer();
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public int getCount()
{
return soundcloudList.size();
}
@Override
public Object getItem(int position)
{
return soundcloudList.get(position);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
if (convertView == null){
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.soundcloud_item, null);
holder.textview = (TextView) convertView.findViewById(R.id.title);
holder.textview2 = (TextView) convertView.findViewById(R.id.id);
holder.textview3 = (TextView) convertView.findViewById(R.id.download);
// holder.btn = (Button) convertView.findViewById(R.id.button);
holder.img1 = (ImageView) convertView.findViewById(R.id.play2);
holder.img2 = (ImageView) convertView.findViewById(R.id.pause);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.textview.setText(soundcloudList.get(position).getTitle());
holder.textview2.setText(soundcloudList.get(position).getId());
holder.textview3.setText("Play Count : "+soundcloudList.get(position).getDownload());
if(soundcloudList.get(position).getPlaying())
{
holder.img1.setVisibility(View.GONE);
holder.img2.setVisibility(View.VISIBLE);
}
else
{
holder.img1.setVisibility(View.VISIBLE);
holder.img2.setVisibility(View.GONE);
}
holder.img1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(final View v)
{
Toast.makeText(context,"img1",Toast.LENGTH_LONG).show();
soundcloudList.get(position).setPlaying(true);
try
{
holder.img1.setVisibility(View.INVISIBLE);
holder.img2.setVisibility(View.VISIBLE);
if(mMediaPlayer.isPlaying())
{
Toast.makeText(context,"isplaying",Toast.LENGTH_LONG).show();
mMediaPlayer.pause();
}
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDataSource("http://api.soundcloud.com/tracks/" + soundcloudList.get(position).getId() + "/stream?client_id=xyz");
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
{
@Override
public void onPrepared(MediaPlayer mp)
{
Toast.makeText(context,"prepatre",Toast.LENGTH_LONG).show();
mp.start();
}
});
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
soundcloudList.get(position).setPlaying(false);
holder.img1.setVisibility(View.VISIBLE);
holder.img2.setVisibility(View.INVISIBLE);
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
holder.img2.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(final View v)
{
Toast.makeText(context,"stop",Toast.LENGTH_LONG).show();;
soundcloudList.get(position).setPlaying(false);
holder.img1.setVisibility(View.VISIBLE);
holder.img2.setVisibility(View.INVISIBLE);
mMediaPlayer.pause();
}
});
return convertView;
}
static class ViewHolder
{
public TextView textview;
public TextView textview2;
public TextView textview3;
public ImageView img1;
public ImageView img2;
public Button btn;
}
}
您似乎多次调用
prepareAsync
,这应该会引发错误
在onClick侦听器中,应首先调用:
mMediaPlayer.reset();
只是一个解决方法:
if(mMediaPlayer.isPlaying()){Toast.makeText(上下文,“isPlaying”,Toast.LENGTH_LONG)。show();mMediaPlayer.pause();mMediaPlayer=new MediaPlayer();}
尝试移动setOnPreparedListener
outside onClick then?您的第一条评论帮助我部分解决了这个问题。如果我播放一首曲目,然后尝试播放另一首曲目,那么上一首曲目将停止,我单击的新曲目将开始播放。这很好。但是如果我通过单击stop停止当前的曲目按钮和“尝试播放任何未播放的曲目”。。用户3249477给出的答案是更好的方法:)试试看。@MysticMagic解决了我的问题。+1到您的第一条评论,因为它也解决了我问题的一部分。。如果我正在播放一首曲目,然后在不停止前一首曲目的情况下尝试播放另一首曲目,则前一首曲目会自动停止,新曲目开始播放..这很好..但唯一的问题是,前一首曲目仍然显示暂停按钮图标,而它应该更改为播放图标,因为它当前未播放..如果你能帮我个忙吗?非常感谢!!如果我正在播放一首曲目,然后在不停止前一首曲目的情况下尝试播放另一首曲目,则前一首曲目会自动停止,新曲目开始播放..这很好..但唯一的问题是,前一首曲目仍然显示暂停按钮图标,而它应该更改为播放图标,因为它当前未播放..如果@user3753273您需要保存最后一首开始的歌曲,每次调用onClick listener时,停止最后一首歌曲(如果存在)。我应该在Soundcloud类中创建一个getter setter方法,该方法包含上一首开始歌曲的位置,然后更改播放停止图标吗accordingly@user3753273这取决于你如何实施它。您可以保存位置,也可以保存要更改其可绘制内容的按钮视图。@user3753273您也可以在适配器类中使用全局变量lastPosition。每次在onClick中都会设置。
mMediaPlayer.reset();