Domanda

Attualmente sto sviluppando la mia prima applicazione Android leggendo Dev documentazione in Android sito ufficiale. Quello che sto cercando di realizzare è quello di giocare alcuni suoni anello. Una sezione dal mio codice è:

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;

public class PlayRingSounds extends Activity {

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

public void PlayRingFile(View view) {       
  switch (view.getId()) {
    case R.id.Button01:
      MediaPlayer mp1 = MediaPlayer.create(this.getApplicationContext(), R.raw.aaa);
      mp1.start();
      break;
    case R.id.Button02:
      MediaPlayer mp2 = MediaPlayer.create(this.getApplicationContext(), R.raw.bbb);
      mp2.start();
      break;        
  }
}   
}

Il problema è quando si fa clic sul tasto 2nd mentre "AAA" (file audio dal 1 ° tasto) sta giocando, "bbb" inizia anche a giocare allo stesso tempo. Esiste un modo per fermare "aaa" prima "bbb" gioca, o c'è un modo per fermare i giocatori tutti i media?

Aggiornamento 12/30/2009 - Il nuovo codice è:

   case R.id.Button01:
       if (mp2.isPlaying())
       {
           mp2.stop();
           mp2.release();
       }
       mp1.reset();
       mp1.prepare();
       mp1.start();
       break;
   case R.id.Button02:
       if (mp1.isPlaying())
       {
           mp1.stop();
           mp1.release();
       }
       mp2.reset();
       mp2.prepare();
       mp2.start();
       break;

mp1.prepare () e mp2.prepare () darà errore IOException.

È stato utile?

Soluzione

Attenzione: Questo non è il modo migliore per farlo , questo è molto scrupoloso, questa è solo un'idea

public void PlayRingFile(View view) {       
  switch (view.getId()) {
   case R.id.Button01:
    if (mp2.isPlaying()) {
       mp2.stop();    // stops the object from playing
       mp2.release(); // always a good practice to release the resource when done
     }
    MediaPlayer mp1 = MediaPlayer.create(this.getApplicationContext(), R.raw.aaa);
    mp1.start();
    break;
   case R.id.Button02:
    if (mp1.isPlaying()) {
       mp1.stop();    // stops the object from playing
       mp1.release(); // always a good practice to release the resource
     }
    MediaPlayer mp2 = MediaPlayer.create(this.getApplicationContext(), R.raw.bbb);
    mp2.start();
    break;        
 }
}

Come ho già detto, questo non è la soluzione migliore, soprattutto se si aggiungono più pulsanti, allora si dovrebbe controllare ogni istanza di MediaPlayer e ci deve essere un modo migliore per fare questo.

I miei suggerimenti sono per cercare di trovare un modo per il ciclo di tutti MediaPlayer di vedere se sono aperti e in caso affermativo, rilasciare la risorsa e smettere di giocare o forse un modo per fermare tutte le MediaPlayer di di giocare in generale?

Io continuerò a cercare altri modi nel frattempo, spero che questo si punta nella direzione giusta.

EDIT (12/30/09):

case R.id.Button01:
   if (mp2.isPlaying())  {
       mp2.stop();
       mp2.release();
   }
   mp1.reset();
   createMPlayer1(); // used to re-initialze the mediaplayer for reuse since resources were released.
   mp1.prepare();
   mp1.start();
   break;
case R.id.Button02:
   if (mp1.isPlaying()) {
       mp1.stop();
       mp1.release();
   }
   mp2.reset();
   createMPlayer2();
   mp2.prepare();
   mp2.start();
   break;

public void createMPlayer1() {
   MediaPlayer mp1 = MediaPlayer.create(this.getApplicationContext(), R.raw.aaa);
}

public void createMPlayer2() {
   MediaPlayer mp2 = MediaPlayer.create(this.getApplicationContext(), R.raw.bbb);
}

Credo che l'IOException potrebbe essere chiamato quando si tenta di accedere nuovamente il file dopo che abbiamo renoved resouce. Ho aggiunto due metodi per creare i file raw separati in quanto credo che l'eccezione si verifica quando le risorse vengono rilasciate. È possibile sia reinizializzata del MediaPlayer o cercare di eliminare il rilascio della risorsa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top