【问题标题】:Clicking on multiple play buttons MediaPlayer starts playing multiple audios at same time单击多个播放按钮 MediaPlayer 开始同时播放多个音频
【发布时间】:2015-01-29 13:24:31
【问题描述】:

我有一个显示曲目列表的列表视图。每个列表项都有播放和停止图标来播放和停止曲目。我遇到的问题是,如果我单击多个播放按钮 MediaPlayer 同时播放多个音频并且那么如果我尝试停止多个音频应用程序崩溃。如何防止 MediaPlayer 同时播放多个音频?我希望如果 mediaplayer 正在播放一个曲目并且用户点击另一个播放按钮 mediaplyer 应该停止播放上一个曲目并播放曲目用户点击的播放按钮..

【问题讨论】:

    标签: android listview audio media-player


    【解决方案1】:

    您必须在适配器构造函数上只创建一个MediaPlayer 对象实例,如下所示:

    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)
                {
                    soundcloudList.get(position).setPlaying(true);
                    try
                    {
                holder.img1.setVisibility(View.INVISIBLE);
                        holder.img2.setVisibility(View.VISIBLE);
    
                        if(mMediaPlayer.isPlaying())
                        {
                            mMediaPlayer.seekTo(0);
                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)
                            {
                                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)
                {
                    soundcloudList.get(position).setPlaying(false);
    
    
                    holder.img1.setVisibility(View.VISIBLE);
                    holder.img2.setVisibility(View.INVISIBLE);
    
            mMediaPlayer.seekTo(0);
            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;
        }
    
    }
    

    【讨论】:

    • 好的..putting mMediaPlayer = new MediaPlayer(); SoundCloudAdapter 内部构造函数在第二次单击播放按钮时不播放音频..如果我播放了一首曲目然后停止它然后尝试播放相同或另一首曲目,那么它将不会播放..如果我正在播放曲目并且单击另一首曲目的播放图标,它将停止当前曲目但不播放另一首曲目..
    • 同样的问题..如果我播放了一首曲目,然后停止它,然后尝试播放相同或另一首曲目,那么它将无法播放..如果我正在播放曲目并单击另一个曲目的播放图标track 它将停止当前曲目但不播放另一首曲目..
    • 我认为您正在多次更新适配器...您需要的解决方案是将 mediaPlayer 对象传递给构造函数...
    • 我应该发布主类和SoundCloud类吗?
    • 当我点击播放图标时,曲目不会每隔两次播放一次。这意味着如果我第一次点击播放图标,那么曲目开始播放,然后如果我尝试点击停止图标通过单击播放图标再次播放曲目,然后它不会被播放,但图标确实从播放图标更改为按预期停止图标。然后单击停止图标后,如果我再次尝试播放曲目,则曲目开始播放。总体而言,曲目每次点击播放图标时都不会播放
    【解决方案2】:

    我遇到的问题是,如果我点击多个播放按钮 MediaPlayer 同时播放多个音频

    这是因为您每次都创建一个 MediaPlayer 的新实例 onClick 触发:

     mMediaPlayer = new MediaPlayer();
    

    创建实例一次(例如在onCreate中),然后在onClick方法中更改url。

    【讨论】:

    • 我也试过了..如果我把 mMediaPlayer = new MediaPlayer();在 getView() 中,点击暂停按钮时音频不会暂停。一旦播放,它就会继续播放。
    • 使用 SoundCloudFragment.java 和 SoundCloud.java 的代码查看更新的问题
    • 如果我把 mMediaPlayer = new MediaPlayer();当我单击播放图标时,SoundCloudAdapter 构造函数中的轨道不会每两次播放一次。这意味着如果我第一次单击播放图标,则轨道开始播放,然后单击停止图标后,如果我尝试通过单击再次播放轨道在播放图标上然后它不会播放但图标确实从播放图标更改为停止图标。然后单击停止图标后如果我再次尝试播放曲目然后曲目开始播放。总体而言,曲目没有被播放每隔一秒我点击播放图标
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多