Подтвердить что ты не робот

Медиаплеер реагирует на второй щелчок, чтобы приостановить

Используется ViewPager для скольжения изображений, каждое изображение в потоковом потоке отличается от MP3.

приложение, включающее 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
            }
        });

UPDATE:

На любой странице:

позволяет указать страницу (одна) --- > нажмите, чтобы воспроизвести MP3 --- > (воспроизведение) --- > нажмите, чтобы приостановить MP3 --- > (приостановлено) --- > проведите по любой странице Rt или Lf --- > (например, на странице (два)) --- > нажмите, чтобы воспроизвести MP3 на странице (два) --- > (воспроизведение) --- > нажмите, чтобы приостановить MP3 на странице (два) --- > (приостановлено) --- > (все предыдущие действия onclick работают корректно) --- > нажмите, чтобы возобновить воспроизведение MP3 на странице (два), которая уже в состоянии паузы ==== > , но ошибочно, когда вы щелкаете по изображению на странице (два), чтобы возобновить воспроизведение MP3, ваш палец не прям, его слегка наклонены, поэтому нажмите пальцем на кнопку (нажмите на страницу (два) и в то же время проведите пальцем по странице (три) ==== > вот проблема с тем, что страница (три) проигрывателя MP3 начинается с самого .

Я хочу, чтобы это случалось случайно или по ошибке, чтобы не начать проигрывать MP3 на странице (три), пока я не щелкнул изображение на странице (три), а затем начал проигрывать MP3.

любая помощь будет действительно оценена.

4b9b3361

Ответ 1

Ответ на первый вопрос: -

Просто скопируйте этот код и сообщите мне, что я его не тестировал, но чувствую, что он будет работать.

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;
            }
        }
    }

Логика получает весь идентификатор ресурса файлов mp3 при запуске приложения, если этот процесс занимает слишком много времени, делайте это на фоновом потоке.

используя эти идентификаторы resorce, воспроизводите ваши песни, теперь многое может быть связано с списком, который вы получаете, так как они могут не совпадать с вашим номером изображения или просмотра, поскольку вам придется применить другую логику, если вы столкнетесь с какой-либо ошибкой. знать.

Раздел Вопросы ответ: - Теперь я предполагаю, что, когда вы хотите щелкнуть по изображению, чтобы воспроизвести музыку в то же самое время по ошибке, страница будет пробита, и когда она дойдет до другой страницы, она сразу начнет воспроизводить эту музыку. Если я понял, что вы сомневаетесь, поскольку я до сих пор не знаю, какой код вы используете, я расскажу вам о методах, основанных на том, что вы можете применить логику.

когда страница меняется на следующую, а затем

onPageChanged(int position)

метод будет называться fooobar.com/questions/78437/... здесь, вы можете применить логику. Теперь как, если музыка играет, и вы находитесь на первой странице, и вы перевернули вторую, что вам нужно сделать в

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

и не вызывайте mp.start(); теперь, когда пользователь нажимает на изображение в

 OnClickListener(View view){
    //use the same instance of mediaplayer and call mp.start();
    if(isPlaying){
       mp.pause();
    }else{
    mp.start();
 }
}

Я предполагаю, что вы используете только один экземпляр MediaPlayer, как показано в коде.

Ответ 2

ПЕРВОЕ Я полагаю, что ваш isPaused останется правдой после приостановки первой песни, вам может потребоваться установить значение false, когда пользователь меняет страницы:

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

ВТОРОЕ Вы можете использовать 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;
         }

Ответ 3

В соответствии с вашим описанием и моим пониманием, я перечисляю требования, которые вы хотите выполнить.

Как только вы нажмете изображение или переключите страницы, MediaPlayer ответит как правила ниже.

ПРАВИЛА:

  • Если предыдущая песня NO воспроизводится, CLICK, игрок начнет воспроизведение песни текущей страницы.

  • Если песня была воспроизведена до того, как игрок все еще проиграл, вы нажмете CLICK, плеер будет PAUSE.

  • Если песня была воспроизведена до того, как проигрыватель все еще воспроизводится, вы переключаете его, игрок ОТПУСКАЕТ до и начнет воспроизведение песни текущей страницы.

  • Если песня была воспроизведена до того, как игрок приостановлен, вы нажимаете CLICK, если текущая страница НЕ была на странице предыдущей песни, проигрыватель ОТПУСКАЕТ до и START воспроизводит песню текущей страницы.

  • Если песня была воспроизведена до того, как игрок приостановлен, вы нажмете CLICK, если на предыдущей странице была остановлена ​​страница песни, игрок будет ПРОДОЛЖИТЬ воспроизведение.

  • Если песня была сыграна до того, как игрок приостановлен, вы переключаетесь, НИЧЕГО не происходит.

Чтение слов непонятно, пожалуйста, проверьте изображение ниже: (Правило 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.
    }
}

Если вы все еще озадачены кодом, см. здесь. Я загрузил свой код в github.