Mediaplayer risponde al secondo clic per mettere in pausa

Usato ViewPager per le immagini scorrevoli, each image in streaming stream di diversi MP3.

app comprese 50 pagine (immagini) e 50 diversi mp3, tutti i file memorizzati su app.

  • SharedPreferences ripristinate dopo la chiusura della forza
  • estendere l'attività del cassetto di navigazione ad altre attività
  • Problemi di memory nei frammenti che mostrano immagini
  • Il frammento non verrà avviato
  • Scaricare nuovamente 9.0.83 Google Play Services manualmente per evitare DynamiteModule: Imansible caricare il descrittore del module
  • Includi layout con gli attributi personalizzati
  • ex. Stream di prima pagina MP3 (uno), stream di seconda pagina MP3 (due) e così via fino alla pagina cinquanta.

    PRIMO:

    il suo lavoro funziona bene solo una sola questione che è:

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

    SECONDO:

    l'app contiene 50 pagine e 50 diversi MP3, ho bisogno di ripetere il codice di mediaplayer 50 volte che ho già fatto o c'è un approccio migliore per farlo in un unico codice applicato a tutti i 50 mediaplayer MP3, in quanto tutti hanno lo stesso ciclo di function .

    qualsiasi suggerimento e come applicarlo nella codifica.

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

    Sono nuovo in android, ho cercato di risolvere il problema ma senza successo, la sua semplice applicazione include solo MainActivity & ImageAdapter.

    ho provato il codice riportto di seguito anche il problema non risolto:

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

    AGGIORNARE:

    In qualsiasi pagina:

    diciamo pagina (uno) —> fai clic per riprodurre MP3 —> (in riproduzione) —> fai clic su per pausa MP3 —> (pausa) —> scorrimento a qualsiasi pagina Rt o Lf — > (scorri a pagina (due) per esempio) —> fai clic per riprodurre MP3 in pagina (due) —> (riproduzione) —> fai clic per mettere in pausa MP3 in pagina (due) —> (pausa ) —> clicca per riprendere la riproduzione di MP3 in pagina (due) già in stato di pausa ==== ma MAI erroneamente quando si fa clic sull'image in pagina (due) per riprendere a suonare l'MP3, il dito non è diretto, il suo leggermente inclinato in modo che il dito scattino a (fare clic su pagina (due) e nello stesso tempo passa a pagina (tre) ====> ecco il problema la pagina (tre ) MP3 inizia a suonare da solo fin dall'inizio.

    Voglio che questo accadesse occasionalmente o erroneamente per non iniziare a suonare l'MP3 in pagina (tre) finché non scatto l'image in pagina (tre) e inizia a suonare l'MP3.

    qualsiasi aiuto sarà veramente apprezzato.

  • Frammento di Google Maps Google in xml. Ottengo "prefisso dello spazio dei nomi inaspettato"
  • Android: Come superare onBackPressed () in AlertDialog?
  • exception libGDX nel thread "Applicazione LWJGL"
  • Imansible creare un ToggleButton in Eclipse IDE per Android
  • Requisiti hardware minimi per lo sviluppo Android
  • OnHandleIntent () non viene chiamato in IntentService
  • 3 Solutions collect form web for “Mediaplayer risponde al secondo clic per mettere in pausa”

    Domande prime domande: –

    Basta copiare incollare questo codice e far sapere che non l'ho provato, ma ho una sensazione forte che functionrà.

     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 logica è get tutti i file di file mp3 id quando si avvia l'applicazione se questo process sta prendendo troppo tempo farlo sul thread di background.

    usando quei resorce id per riprodurre le tue canzoni ora c'è un certo numero di problemi con l'elenco che hai scelto come potrebbero non corrispondere all'image o al numero di viewpager per cui dovrai applicare un'altra logica se incontrai un errore, per far sapere.

    Sec Domande rispondono: – Ora suppongo che quando si desidera click sull'image per riprodurre la musica allo stesso tempo per errore la pagina sta diventando spazzata e quando raggiunge un'altra pagina inizia a suonare immediatamente la musica di quella pagina. Se ti ho capito la domanda mentre non so ancora quale codice stai utilizzando, ti guiderò attraverso i methods basati su quello che puoi applicare la logica.

    quando la pagina cambia poi a quella successiva

     onPageChanged(int position) 

    il metodo verrà chiamato https://stackoverflow.com/a/11294494/5492047 qui è ansible applicare la logica. Adesso come, se la musica sta giocando e tu sei sulla prima pagina e hai spazzato via al secondo quello che devi fare

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

    e non call mp.start (); ora quando l'utente fa clic sull'image

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

    Suppongo che utilizzi una sola istanza di MediaPlayer non come se hai mostrato nel tuo codice.

    PRIMO Credo che il tuo isPaused rimane vero dopo aver isPaused la prima song, potrebbe essere necessario impostarlo a false quando l'utente cambia pagine:

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

    SECOND È ansible utilizzare un List<Integer> che puoi inizializzare all'inizio dell'app, quindi puoi avere una struttura per memorizzare le tue canzoni, in quanto è l'unica cosa che cambia nel tuo codice, ad esempio:

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

    E poi sul tuo metodo onSingleTapConfirmed è ansible accedervi solo per indice una sola volta:

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

    Secondo la tua descrizione e la mia comprensione, elenco le richieste che vuoi che il programma faccia.

    Una volta cliccate sull'image o passate le pagine, MediaPlayer risponderà come le regole di seguito.

    REGOLE:

    1. Se NO canzone ha giocato prima, CLICK, il giocatore inizia a suonare la song della pagina corrente.

    2. Se una canzone ha suonato prima e il giocatore è ancora in GIOCO, CLICCA, il giocatore scenderà in PAUSA.

    3. Se una canzone ha suonato prima e il giocatore ancora sta giocando, si commuta, il giocatore rilascerà prima e START la riproduzione del brano della pagina corrente.

    4. Se una canzone ha giocato prima e il giocatore è in pausa, CLICK, se la pagina corrente NON è la pagina della canzone in pausa prima, il lettore rilascerà prima e START la riproduzione della song della pagina corrente.

    5. Se una canzone ha giocato prima e il giocatore è in pausa, CLICK, se la pagina corrente è la pagina della canzone in pausa prima, il giocatore continuerà a giocare.

    6. Se una canzone ha suonato prima e il giocatore è in pausa, si SWITCH, NON si suona.

    Le parole di lettura sono incomprensibili, si prega di controllare l'image qui sotto: (La regola 1 è uguale a quella della regola 4.) regole

    Se non esiste alcuna incomprensione, comincerò a rispondere alla domanda. O prego, fathemes sapere.

    Ora, chiarire come rispondere al giocatore quando si fa clic o si passa le pagine nella situazione diversa (se la pagina corrente è la pagina della song in pausa prima).

    Parliamo di come evitare il codice ridiplicato. Come ha detto altre risposte, utilizza l'elenco delle canzoni e utilizza l'indice (numero di pagina) per distinguere ciascuno di essi.

    Quindi sono dichiarati così:

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

    E quando si fa clic sull'image (impostare OnClickListener sull'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; } }); } 

    E quando le pagine 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. } } 

    Se sei ancora preoccupato per il codice, per favore vedi qui . Ho caricato il mio codice su github.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.