Mediaplayer responde al segundo clic para pausar

Usado ViewPager para las imágenes de deslizamiento, cada imagen onclick corriente MP3 diferente.

Incluyendo 50 páginas (imágenes) y 50 diferentes mp3, todos los mp3 almacenados en la propia aplicación.

ex. Transmisión de la primera página MP3 (una), streaming de la segunda página MP3 (dos) y así sucesivamente hasta la página cincuenta.

PRIMERO:

Su trabajo bien sólo una cuestión que es:

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). 

SEGUNDO:

La aplicación contiene 50 páginas y 50 MP3 diferentes, ¿necesito repetir el código mediaplayer 50 veces que ya lo hice, o hay mejor enfoque para hacerlo en código único aplicado a todos los 50 reproductores de MP3, ya que todo tiene el mismo ciclo de función .

Cualquier consejo por favor y cómo aplicarlo en la codificación.

Actividad principal :

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

Soy nuevo en android, traté de arreglarlo pero sin éxito, su sencilla aplicación sólo incluye MainActivity y ImageAdapter.

He intentado el código de abajo también todavía el problema no resuelto:

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

ACTUALIZAR:

En cualquier página:

Vamos a decir página (uno) —> haga clic para reproducir MP3 —> (tocando) —> haga clic para pausar MP3 —> (pausado) —> deslizar a cualquier página Rt o Lf — — (haga clic en la página (dos) por ejemplo) —> haga clic para reproducir MP3 en la página (dos) —> (reproduciendo) —> haga clic para pausar MP3 en la página (dos) —> ) —> (todos los anteriores onclick acción funcionando correctamente) —> haga clic para reanudar la reproducción de MP3 en la página (dos) que ya en estado de pausa ====> pero erróneamente al hacer clic en la imagen en la página (dos) Reanudar la reproducción de MP3, el dedo no es recto, su ligeramente inclinado por lo que el dedo haga clic en (haga clic en la página (dos) y al mismo tiempo deslizar a la página (tres) ====> aquí está el problema de la página (tres ) MP3 comenzar a jugar por sí mismo desde el principio.

Quiero que esto suceda de vez en cuando o por error no empiece a reproducir el MP3 en la página (tres) hasta que haga clic en la imagen en la página (tres) y luego comenzar a reproducir el MP3.

Cualquier ayuda será muy apreciada.

Primeras preguntas: –

Simplemente copie este código y déjeme saber que no lo he probado pero tengo una fuerte sensación de que funcionará.

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

La lógica es obtener todos los archivos mp3 id de recursos cuando se inicia la aplicación si este proceso está tomando demasiado tiempo hacerlo en el hilo de fondo.

Usando esos id de resorce reproducir tus canciones ahora hay mucho problema con la lista que buscar como si no pueden coincidir con su imagen o número de viewpager para que tendrá que aplicar alguna otra lógica si se encuentra con cualquier error, házmelo saber.

Sec Preguntas respuesta: – Ahora presumo que cuando usted quiere hacer clic en la imagen para reproducir la música al mismo tiempo por error la página está recibiendo swiped y cuando llegó a otra página que empezar a reproducir la música de esa página inmediatamente. Si he entendido que la pregunta como todavía no sé qué código está utilizando I ll guía a través de los métodos basados ​​en que se puede aplicar la lógica.

Cuando la página cambia a la siguiente, entonces

 onPageChanged(int position) 

Método se llamará https://stackoverflow.com/a/11294494/5492047 aquí se puede aplicar la lógica. Ahora cómo, si la música está jugando y estás en la primera página y pasas a la segunda lo que tienes que hacer en

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

Y no llame mp.start (); Ahora cuando el usuario hace clic en la imagen en

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

Supongo que estás usando sólo una instancia de MediaPlayer no como lo has mostrado en tu código.

PRIMERO Creo que su isPaused se mantiene cierto después de pausar la primera canción, es posible que deba establecerla en false cuando el usuario cambie de página:

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

SEGUNDO Puede usar una List<Integer> que puede inicializar al inicio de su aplicación, para que pueda tener una estructura para almacenar sus canciones, ya que es lo único que cambia en su código, por ejemplo:

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

Y luego en su método onSingleTapConfirmed sólo puede acceder a ellos por índice sólo una vez:

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

De acuerdo con su descripción y mi comprensión, lista las demandas que desea que el programa haga.

Una vez que haga clic en la imagen o cambiar páginas, MediaPlayer responderá como las reglas a continuación.

REGLAS:

  1. Si NO se reproduce ninguna canción antes, CLICK, el reproductor comenzará a reproducir la canción de la página actual.

  2. Si una canción tocada antes y el jugador sigue jugando, CLICK, el jugador PAUSE.

  3. Si una canción tocada antes y el reproductor sigue jugando, SWITCH, el reproductor se LIBERA antes y empieza a reproducir la canción de la página actual.

  4. Si una canción reproducida antes y el reproductor está en pausa, CLICK, si la página actual NO es la página de la canción detenida antes, el reproductor se LIBERA antes y empieza a reproducir la canción de la página actual.

  5. Si una canción reproducida antes y el reproductor está en pausa, CLICK, si la página actual es la página de la canción detenida antes, el reproductor CONTINUARá tocando.

  6. Si una canción tocada antes y el reproductor está en pausa, usted cambia, NADA sucede.

La lectura de palabras es incomprensible, por favor compruebe la siguiente imagen: (La Regla 1 es en realidad la misma que la Regla 4.) reglas

Si no hay malentendido, comenzaré contestando la pregunta. O por favor hágamelo saber.

Ahora, dejamos claro cómo responder al reproductor al hacer clic o cambiar de página en la situación diferente (si la página actual es la página de la canción detenida antes).

Hablemos de cómo evitar el código reduplicado. Como otra respuesta dijo, utilice la lista de canciones y utilice el índice (número de página) para distinguir cada uno de ellos.

Así se declaran así:

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

Y cuando hace clic en la imagen (configure OnClickListener en la imagen):

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

Y cuando cambie las páginas:

 @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. } } 

Si todavía está desconcertado acerca del código, por favor vea aquí . Subí mi código en github.

  • Hacer un temporizador de intervalo en Java android
  • Comenzando en una nueva línea en el emulador (proyecto Android Eclipse)
  • ¿Puedo crear una aplicación web para ser utilizada en teléfonos inteligentes sin Internet? ¿Cómo?
  • Ejecutar Android App Error (FATAL EXCEPTION: principal Proceso: PID: 14099)
  • Cifrar vídeo en marcha desde la cámara Android
  • Plugin de androide phonegap ActionBar wrapper
  • Cómo compartir un objeto entre dos subprocesos (sincronización de subprocesos)?
  • Android Speech Recognition API no funciona en Android 7 Nougat
  • Android Show Soft Keyboard cuando se inicia la primera actividad?
  • No se puede ejecutar un AlertDialog en un método doInbackground ()
  • Cómo utilizar assert en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.