媒体播放器响应第二次点击暂停

时间:2017-07-09 14:59:37

标签: java android android-viewpager android-mediaplayer

使用ViewPager进行图像滑动,每个图像点击流不同的MP3。

app包括50页(图像)& 50个不同的mp3,所有mp3都存储在应用程序本身。

离。第一页流MP3(一),第二页流MP3(二)等到第五十页。

FIRST:

它的工作正常只有一个问题:

In any page --> clicking the image --> 

 PLAY MP3(one) --> click again--> PAUSE MP3 -->
 in paused state of MP3(one) SWIPE to next page --> 

--> in next page --> clicking the image -->
  PLAY MP3(two) --> click to pause the MP3(two)

   --> it doesn't respond to first click,it respond to second click to pause MP3(two).

第二次:

该应用程序包含50页和50种不同的MP3,我是否需要重复50次我已经做过的媒体播放器代码,或者有更好的方法来应用于所有50个媒体播放器MP3的单个代码,因为所有有相同的功能周期。

请提出任何建议,以及如何将其应用于编码。

MainActivity:

public class MainActivity extends Activity {

private ViewPager mViewPager;
MediaPlayer mp;
private boolean isPaused;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mViewPager= (ViewPager) findViewById(R.id.view_pager);
    ImageAdapter adapter = new ImageAdapter(this);
    mViewPager.setAdapter(adapter);

    final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener());
    mViewPager.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            tapGestureDetector.onTouchEvent(event);
            return false;
        }
    });
}

private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        if (mViewPager.getCurrentItem() == 0) {
            if (mp != null) {
                if (isPaused) {
                    mp.start();
                    isPaused = false;
                } else {
                    mp.pause();
                    isPaused = true;
                }
            } else {
                mp = MediaPlayer.create(MainActivity.this, R.raw.aa);
                mp.start();

                    }
                }

        if (mViewPager.getCurrentItem() == 1) {
            if (mp != null) {
                if (isPaused) {
                    mp.start();
                    isPaused = false;
                } else {
                    mp.pause();
                    isPaused = true;
                }
            } else {
                mp = MediaPlayer.create(MainActivity.this, R.raw.bb);
                mp.start();                  
            }
        }

        if (mViewPager.getCurrentItem() == 2) {
            if (mp != null) {
                if (isPaused) {
                    mp.start();
                    isPaused = false;
                } else {
                    mp.pause();
                    isPaused = true;
                }
            } else {
                mp = MediaPlayer.create(MainActivity.this, R.raw.cc);
                mp.start();                 
            }
        }

        if (mViewPager.getCurrentItem() == 3) {
            if (mp != null) {
                if (isPaused) {
                    mp.start();
                    isPaused = false;
                } else {
                    mp.pause();
                    isPaused = true;
                }
            } else {
                mp = MediaPlayer.create(MainActivity.this, R.raw.dd);
                mp.start();
            }
        }
      //AND SO ON FOR 50 PAGES//  
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {   
                if (mp == null) {
                    return;
                }
                mp.release();
                mp = null;
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub                  
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
            }
        });

        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer m) {
                Toast.makeText(MainActivity.this, 
                        "COMPLETED", Toast.LENGTH_LONG).show();
                // Set the MainActivity member to null
                MainActivity.this.mp = null;
            }
        });

        return super.onSingleTapConfirmed(e);
       }
   }
}

ImageAdapter:

  public class ImageAdapter extends PagerAdapter {
Context context;
private int[] GalImages = new int[] {
    R.drawable.a,
    R.drawable.b,
    R.drawable.c,
    R.drawable.d,

};
ImageAdapter(Context context){
    this.context=context;
}
@Override
public int getCount() {
  return GalImages.length;
}

@Override
public boolean isViewFromObject(View view, Object object) {
  return view == ((ImageView) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
  ImageView imageView = new ImageView(context);
  int padding = context.getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin);
  imageView.setPadding(padding, padding, padding, padding);
  imageView.setScaleType(ImageView.ScaleType.CENTER);
  imageView.setImageResource(GalImages[position]);
  ((ViewPager) container).addView(imageView, 0);
  return imageView;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
  ((ViewPager) container).removeView((ImageView) object);
   }
 }

我是Android的新手,我试图解决它,但没有成功,它的简单应用只包括MainActivity& ImageAdapter。

我尝试了以下代码,但问题仍未解决:

  mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {   
                if (mp != null) {
                    if (mp.isPlaying()) {
                        mp.stop();
                    }
                    mp.release();
                    mp = null;
                }
            }
            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub                  
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
            }
        });

更新

在任何页面中:

让我们说第(1)页--->点击播放MP3 ---> (播放)--->点击暂停MP3 ---> (暂停)--->滑动到任何页面Rt或Lf --->(例如,刷到页面(两个))--->点击播放第(二)页上的MP3 ---> (播放)--->点击暂停第二页上的MP3 ---> (暂停)---> (所有以前的onclick动作正常工作)--->点击继续播放已经处于暂停状态的页面(两个)中的MP3 ====> 但是当您点击第(二)页中的图像以恢复播放MP3时,您的手指不直,它略微倾斜所以手指点击导致(点击页面(二)并同时刷到页面(三) ====> 这里是问题页面(三) MP3从一开始就由本身开始播放。

我想要在偶然或错误的情况下不要开始播放第(3)页的MP3,直到我点击第(3)页中的图像然后开始播放MP3。

任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:0)

<强>第一 我相信你的isPaused在暂停第一首歌后仍然存在,当用户更改网页时,你可能需要将其设置为false:

public void onPageSelected(int position) {   
            if (mp == null) {
                return;
            }
            mp.release();
            mp = null;
            isPaused = false;
        }

<强> SECOND 你可以使用你可以在应用程序开始时初始化的List<Integer>,这样你就可以有一个存储歌曲的结构,因为它是你代码中唯一改变的东西,例如:

List<Integer> songs;

@Override
public void onCreate(Bundle savedInstanceState) {
...
    songs = new ArrayList<>();
    songs.add(R.raw.aa);
    songs.add(R.raw.bb);
//...etc
}

然后在您的onSingleTapConfirmed方法上,您只需按索引访问它们一次:

        if (mp != null) {
            if (isPaused) {
                mp.start();
                isPaused = false;
            } else {
                mp.pause();
                isPaused = true;
            }
        } else {
            mp = MediaPlayer.create(MainActivity.this, 
                     songs.get(mViewPager.getCurrentItem()));
            mp.start();
            isPaused = false;
         }

答案 1 :(得分:0)

第一个问题回答: -

只需复制粘贴此代码,然后让我知道我没有对其进行测试,但我们有一种强烈的感觉,它会起作用。

pip

当您启动应用程序时,如果此过程花费太多时间在后台线程上执行,则逻辑是获取所有mp3文件资源ID。

使用那些resorce id播放你的歌曲现在很多你所获取的列表有些问题,因为它们可能与你的图片或viewpager编号不匹配,因为如果遇到任何错误,你必须应用其他逻辑让我知道。

Sec问题答案: - 现在我假设当你想点击图像同时播放音乐时,页面会被刷过,当它到达其他页面时,它会立即开始播放该页面的音乐。如果我理解你的问题,因为我仍然不知道你使用的代码,我将引导你完成基于你可以应用逻辑的方法。

当页面更改为下一页时

import java.lang.reflect.Field;
    public class MainActivity extends Activity {

        private ViewPager mViewPager;
        MediaPlayer mp;
        private boolean isPaused;
        private ArrayList<Integer> mMp3s;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            mViewPager = (ViewPager) findViewById(R.id.view_pager);
            ImageAdapter adapter = new ImageAdapter(this);
            mMp3s=getAllMp3FilesFromRaw();
            mViewPager.setAdapter(adapter);

            final GestureDetector tapGestureDetector = new GestureDetector(this, new TapGestureListener());
            mViewPager.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) {
                    tapGestureDetector.onTouchEvent(event);
                    return false;
                }
            });
        }

        private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {

                    if (mp != null) {
                        if (isPaused) {
                            mp.start();
                            isPaused = false;
                        } else {
                            mp.pause();
                            isPaused = true;
                        }
                    } else {
                        mp = MediaPlayer.create(MainActivity.this, mMp3s.get(mViewPager.getCurrentItem()));
                        mp.start();
                        isPaused = false;
                    }


                //AND SO ON FOR 50 PAGES//
                mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        if (mp == null) {
                            return;
                        }
                        mp.release();
                        mp = null;
                        isPaused = true;
                    }

                    @Override
                    public void onPageScrollStateChanged(int arg0) {
                        // TODO Auto-generated method stub
                    }

                    @Override
                    public void onPageScrolled(int arg0, float arg1, int arg2) {
                        // TODO Auto-generated method stub
                    }
                });

                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    public void onCompletion(MediaPlayer m) {
                        Toast.makeText(MainActivity.this, "COMPLETED", Toast.LENGTH_LONG).show();
                        // Set the MainActivity member to null
                        finish();
                        MainActivity.this.mp = null;
                    }
                });

                return super.onSingleTapConfirmed(e);
            }
        }

        /**
        *Do it on background thread if it blocks the UI.
        */
        private ArrayList<Integer> getAllMp3FilesFromRaw() {
            ArrayList<Integer> mp3s = new ArrayList<>();
            try {
                Field fields[] = R.raw.class.getDeclaredFields();
                for (int i = 0; i < fields.length; i++) {
                    Field f = fields[i];

                    int resIdentifier = getResources().getIdentifier(f.getName(), "raw", getPackageName());
                    mp3s.add(resIdentifier);
                }
                return mp3s;

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }

方法将被称为https://stackoverflow.com/a/11294494/5492047,您可以在此处应用逻辑。 现在如何,如果音乐正在播放,你在第一页,你刷到第二个,你必须做什么

onPageChanged(int position)

并且不要调用mp.start(); 现在,当用户点击

中的图像时
onPageChanged(int position)
    {
     mp.release();
     mp=null;
    //Now initialiase it again with page two's music.
    mp = MediaPlayer.create(MainActivity.this, R.raw.aa);
    }

我假设您只使用一个MediaPlayer实例,而不是您在代码中显示的内容。

答案 2 :(得分:0)

根据您的描述和我的理解,我列出了您希望程序执行的要求。

单击图像或切换页面后,MediaPlayer将按照以下规则进行响应。

<强>规则:

  1. 如果之前没有播放歌曲,则点击,播放器将开始播放当前页面的歌曲。

  2. 如果以前播放过一首歌并且播放器仍在播放,则单击,播放器将暂停播放。

  3. 如果以前播放过一首歌并且播放器仍在播放,则您开机,播放器将在之前释放并开始播放当前页面的歌曲。

  4. 如果之前播放的歌曲和播放器暂停,则点击,如果当前页面不是之前暂停的歌曲页面,则播放器将在之前释放并开始播放当前页面的歌曲。

  5. 如果之前播放的歌曲和播放器暂停,则点击,如果当前页面是之前暂停的歌曲页面,播放器将继续播放。

  6. 如果之前播放的歌曲和播放器暂停,则会切换,不会发生。

  7. 阅读单词难以理解,请查看下图: (规则1实际上与规则4相同。) rules

    如果没有误会,我会开始回答这个问题。或者请告诉我。

    现在,我们清楚地说明了在不同情况下点击或切换页面时玩家的响应方式(当前页面是否是之前暂停的歌曲页面)。

    让我们谈谈如何避免重复代码。正如其他答案所说,使用歌曲列表并使用索引(页面数量)来区分它们。

    所以他们被宣布为:

    List<Integer> mMP3s = new ArrayList<Integer>() {
        {
            add(R.raw.mp3_0);
            add(R.raw.mp3_1);
            add(R.raw.mp3_2);
            add(R.raw.mp3_3);
            add(R.raw.mp3_4);
            //...
            //AND SO ON FOR 50 PAGES//  
        }
    };
    

    当您单击图像(在图像上设置OnClickListener)时:

    @Override
    public void onClick(View view) {
        int position = mViewPager.getCurrentItem();
        if (mp != null) {
            if (isPaused) {
                if (pausedPage == position) {
                    mp.start();
                } else {
                    mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position));
                    mp.start();
                }
                isPaused = false;
            } else {
                mp.pause();
                isPaused = true;
                pausedPage = position;
            }
        } else {
            mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position));
            mp.start();
            isPaused = false;
        }
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer m) {
                Toast.makeText(MainActivity.this,
                        "COMPLETED", Toast.LENGTH_LONG).show();
                // Set the MainActivity member to null
                MainActivity.this.mp = null;
            }
        });
    }
    

    当您切换页面时:

    @Override
    public void onPageSelected(int position) {
        if (!isPaused) {
            mp.release();
            mp = MediaPlayer.create(MainActivity.this, mMP3s.get(position));
            mp.start();
            tv.append("START page" + position + "\n");
        } else {
            //do nothing.
        }
    }
    

    如果您仍然对代码感到困惑,请参阅here。我在github上传了我的代码。