Android 使用MediaPlayer类播放音频(曲目仅第一次播放)

Android 使用MediaPlayer类播放音频(曲目仅第一次播放),android,audio,android-mediaplayer,Android,Audio,Android Mediaplayer,下面是显示曲目列表的listview适配器的代码。每个列表项都有播放和停止图标来播放和停止曲目。我遇到的问题是,只有在我单击播放按钮时,曲目才会第一次播放。之后,如果我单击停止按钮停止播放,并且尝试播放任何曲目,则不会播放。通过toast消息我发现holder.img1.setOnClickListener()方法确实会被调用,但第二次或之后单击播放按钮时不会调用onPrepared()方法。但是onPrepared()方法确实会第一次被调用,这就是为什么第一次播放曲目 如果我放置mMediaP

下面是显示曲目列表的listview适配器的代码。每个列表项都有播放和停止图标来播放和停止曲目。我遇到的问题是,只有在我单击播放按钮时,曲目才会第一次播放。之后,如果我单击停止按钮停止播放,并且尝试播放任何曲目,则不会播放。通过toast消息我发现holder.img1.setOnClickListener()方法确实会被调用,但第二次或之后单击播放按钮时不会调用onPrepared()方法。但是onPrepared()方法确实会第一次被调用,这就是为什么第一次播放曲目

如果我放置
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();