Mediaplayer répond au deuxième clic pour faire une pause

Utilisé ViewPager pour les images glissant, chaque image onclick diffuse différents MP3.

Application comprenant 50 pages (images) et 50 mp3 différents, tous les mp3 stockés sur l'application elle-même.

  • Serialisation / Désérialisation et Probar
  • Tag: TextLayoutCache Texte: Cache Valeur supprimée
  • Comment lire le tampon de trame actuel dans Android?
  • SharedPreferences de différentes activités
  • Faites glisser n drop textview sur Android
  • Java.lang.RuntimeException: Un seul Looper peut être créé par thread
  • ex. Flux de première page MP3 (un), flux de seconde page MP3 (deux) et ainsi de suite jusqu'à la page cinquante.

    PREMIER:

    Son travail fonctionne bien, mais seulement un problème:

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

    SECONDE:

    L'application contient 50 pages et 50 fichiers MP3 différents, dois-je répéter le code mediaplayer 50 fois que j'ai déjà fait, ou il y a une meilleure approche pour le faire en code unique appliqué à tous les 50 mediaplayer MP3, car tout a le même cycle de fonction .

    Tout conseil s'il vous plaît et comment l'appliquer dans le codage.

    Activité principale :

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

    Je suis nouveau sur Android, j'ai essayé de le réparer mais sans succès, son application simple comprend simplement MainActivity & ImageAdapter.

    J'ai essayé le code ci-dessous encore le problème n'est pas résolu:

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

    METTRE À JOUR:

    Dans n'importe quelle page:

    Disons page (un) —> clique ici pour lire MP3 —> (play) —> cliquer pour mettre en pause MP3 —> (en pause) —> glisser vers n'importe quelle page Rt ou Lf — > (Passez à la page (deux) par exemple) —> cliquez pour lire MP3 sur la page (deux) —> (lecture) —> cliquez pour mettre en pause MP3 sur la page (deux) —> (en pause ) —> (toutes les actions précédentes onclick fonctionnent correctement) —> cliquez pour reprendre la lecture de MP3 dans la page (deux) qui est déjà en état de pause ====> MAIS par erreur lorsque vous cliquez sur l'image dans la page (deux) à Reprendre la lecture du MP3, votre doigt pas droit, il est légèrement incliné, de sorte que le clic du doigt conduit à (cliquez sur la page (deux) et en même temps passez à la page (trois) ====> voici le problème de la page (trois ) MP3 commence à jouer lui-même dès le début.

    Je veux que cela se produise occasionnellement ou à tort pour ne pas commencer à jouer le MP3 en page (trois) jusqu'à ce que je clique sur l'image en page (trois) puis commencez à jouer le MP3.

    Toute aide sera vraiment appréciée.

  • Comment configurer dagger + gradle
  • Rechargez l'application Android dans l'émulateur sans redémarrer l'émulateur dans Eclipse?
  • ASync Task ne peut pas être exécuté deux fois
  • Application Android pour l'application Twitter
  • View.getViewTreeObserver (). AddOnGlobalLayoutListener fuites Fragment
  • Je souhaite avoir un nombre de semaines dans un mois particulier
  • 3 Solutions collect form web for “Mediaplayer répond au deuxième clic pour faire une pause”

    Première réponse aux questions: –

    Il suffit de copier collez ce code et laissez-moi savoir que je ne l'ai pas testé, mais j'ai le sentiment fort qu'il fonctionnera.

     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 logique est d'obtenir tous les identifiants de ressources de fichiers mp3 lorsque vous démarrez l'application si ce processus prend trop de temps, faites-le sur un thread d'arrière-plan.

    En utilisant ces identifiants de résorption, écoutez vos morceaux maintenant, il y a beaucoup de problèmes avec la liste que vous achetez, car ils ne correspondent pas à votre image ou votre numéro de visionnement pour cela, vous devrez appliquer une autre logique si vous rencontrez une erreur, faites-le savoir.

    Réponse aux questions: – Maintenant, je présume que lorsque vous souhaitez cliquer sur l'image pour jouer la musique en même temps par erreur, la page est glissée et quand elle a atteint une autre page, elle commence à jouer de la musique de cette page immédiatement. Si je vous ai compris que je ne sais toujours pas quel code utilisez, je vous guiderai à travers les méthodes basées sur cela, vous pouvez appliquer la logique.

    Lorsque la page passe à la suivante

     onPageChanged(int position) 

    La méthode s'appellera https://stackoverflow.com/a/11294494/5492047 ici, vous pouvez appliquer la logique. Maintenant comment, si la musique est en cours de lecture et que vous êtes sur la première page et que vous avez passé à la seconde, que vous devez faire dans

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

    Et ne pas appeler mp.start (); Maintenant lorsque l'utilisateur clique sur l'image dans

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

    Je suppose que vous n'utilisez qu'une seule instance de MediaPlayer comme vous l'avez montré dans votre code.

    PREMIER Je crois que votre isPaused reste vrai après avoir interrompu la première chanson, vous devrez peut-être la définir comme fausse lorsque l'utilisateur change de pages:

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

    DEUXIÈME Vous pouvez utiliser une List<Integer> que vous pouvez initialiser au début de votre application afin que vous puissiez avoir une structure pour stocker vos chansons, car c'est la seule chose qui change dans votre code, par exemple:

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

    Ensuite, sur votre méthode onSingleTapConfirmed , vous pouvez simplement les accéder par index une seule fois:

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

    Selon votre description et ma compréhension, je énumère les demandes que vous voulez que le programme fasse.

    Une fois que vous cliquez sur l'image ou que vous changez de pages, MediaPlayer répondra comme les règles ci-dessous.

    RÈGLES:

    1. Si NO music n'a pas joué, CLIQUEZ, le joueur démarrera la lecture de la chanson de la page actuelle.

    2. Si une chanson a joué avant et que le joueur est encore en train de jouer, CLIQUEZ, le joueur PAUSE.

    3. Si une chanson a déjà été jouée et que le joueur est encore en train de jouer, vous COMMENCER, le joueur relâche avant et MARCHE la chanson de la page actuelle.

    4. Si une chanson jouée avant et un joueur est en pause, CLIQUEZ, si la page actuelle N'EST PAS la page de la chanson déjà interrompue, le lecteur DÉMOCRA avant et MARCHE la chanson de la page actuelle.

    5. Si une chanson jouée avant et le joueur est en pause, CLIQUEZ, si la page actuelle est la page de la chanson interrompue avant, le joueur CONTINUERA à jouer.

    6. Si une chanson a joué avant et que le joueur est en pause, vous vous connectez, rien ne se produit.

    La lecture des mots est incompréhensible, vérifiez l'image ci-dessous: (La règle 1 est en fait la même que la règle 4.) règles

    S'il n'y a pas de malentendu, je vais commencer à répondre à la question. Ou laissez-moi savoir s'il vous plaît.

    Maintenant, nous indiquons comment la réponse du joueur lorsque vous cliquez ou changez de pages dans la situation différente (que la page actuelle soit la page de la chanson déjà mise en pause).

    Laissez-nous parler de la façon d'éviter le code réduit. Comme l'a dit une autre réponse, utilisez la liste des chansons et utilisez l'index (nombre de pages) pour les distinguer.

    Donc, ils sont déclarés comme ça:

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

    Et lorsque vous cliquez sur l'image (définissez OnClickListener sur l'image):

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

    Et lorsque vous appuyez sur les pages SWITCH:

     @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 vous êtes toujours perplexe au sujet du code, consultez ici . J'ai téléchargé mon code sur github.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.