2010-07-30 16 views
41

Estoy tratando de reproducir un archivo de sonido con el clic de un botón. El sonido tiene solo 1 segundo de duración. Funciona bien las primeras veces que hago clic en el botón, pero después de un tiempo da un NullPointerException. Aquí está el código:Android - reproducir sonido al hacer clic en el botón - excepción de puntero nulo

button[i].setOnClickListener(new OnClickListener() { 
    public void onClick(View view) {   
     mp = MediaPlayer.create(Test.this, R.raw.mysound); 
     mp.start(); 
    } 
}); 

Y aquí está la excepción:

07-29 23:07:27.690: ERROR/AndroidRuntime(10542): Uncaught handler: thread main exiting due to uncaught exception 
07-29 23:07:27.710: ERROR/AndroidRuntime(10542): java.lang.NullPointerException 
07-29 23:07:27.710: ERROR/AndroidRuntime(10542):  at com.example.mypackage.Test$3.onClick(Test.java:270) 
+3

no está seguro de si ayuda, pero tal vez probar un mp.reset() en la terminación? –

+0

Sí, ¡ayudó! ¡Gracias! – Chris

+0

Si desea que los recursos se administren automáticamente, para que pueda llamar a 'MusicManager.getInstance(). Play (this, R.raw.my_sound);' etc., esta biblioteca puede ser para usted: https: // github .com/delight-im/Android-Audio – caw

Respuesta

4

Se podría resolver su problema,

button[i].setOnClickListener(new OnClickListener() { 
    public void onClick(View view) {  
     new Thread(){ 
      public void run(){ 
       mp = MediaPlayer.create(Test.this, R.raw.mysound); 
       mp.start(); 
     }.start(); 
    } 
}); 
+0

Aún funciona bien para los primeros clics, y luego da una excepción de puntero nulo, particularmente cuando hago clic en los botones rápidamente en sucesión. – Chris

+0

puede intentarlo, 1) poner el cheque antes de comenzar. me refiero a verificar si el jugador está en la etapa de juego y luego no ejecutar esta declaración mp = MediaPlayer.create (Test.this, R.raw.mysound); mp.start(); o 2) make mp como variable local – sohilv

101

Gracias por sus respuestas! ¡Lo aprecio!

Así es como finalmente he conseguido que funcione:

  button[i].setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { 

        mp = MediaPlayer.create(Test.this, R.raw.mysound); 
        mp.setOnCompletionListener(new OnCompletionListener() { 

         @Override 
         public void onCompletion(MediaPlayer mp) { 
          // TODO Auto-generated method stub 
          mp.release(); 
         } 

        }); 
        mp.start(); 
       } 

      }); 
+9

parece que el .setOnCompletionListener debe aparecer antes que el .start no después de (?) –

+0

Estoy de acuerdo con Ryan. – Carcamano

+0

cambió el orden de las llamadas – WarrenFaith

0

Si todavía no se resuelve su problema a continuación, tratar esto, ya que me ayude.

public void playSound(int resources){ 
     try{ 
      boolean mStartPlaying = true; 
      MediaPlayer mPlayer=null; 
      if (mStartPlaying==true){ 
       mPlayer = new MediaPlayer(); 

       Uri uri = Uri.parse("android.resource://YOUR_PACKAGENAME/" + resources); 
       mPlayer.setDataSource(getApplicationContext(),uri); 
       mPlayer.prepare(); 
       mPlayer.start(); 
      } 
      else{ 
       mPlayer.release(); 
       mPlayer = null; 
      } 
      mStartPlaying = !mStartPlaying; 
     } 
     catch (IOException e){ 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 

//  MediaPlayer mp = MediaPlayer.create(SpyMainActivity.this, resources); 
//  mp.start(); 

    } 

Enjoy. :)

24

También puede probar:

final soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 
final sound = soundPool.load(this, R.raw.mysound, 1); 

button[i].setOnClickListener(new OnClickListener() 
{ 
    public void onClick(View view) 
    {  
     soundPool.play(sound, 1.0f, 1.0f, 0, 0, 1.0f); 
    } 
}); 
+6

Parece que esta es la mejor manera de hacerlo cuando se reproduce un sonido repetitivo y corto al hacer clic con el botón (en lugar de crear/destruir un reproductor multimedia cada vez). No olvides hacer un 'soundPool.release();' en tu 'onDestroy' (o donde sea que estés limpiando la Actividad). – Alconja

+0

@Alconja En mi experiencia no hay ninguna garantía de que se llame realmente a Destroy (es decir, el asesino de tareas de Android generalmente mata mi aplicación sin previo aviso). – Michael

+0

@Michael cada vez que se mata la aplicación de esta manera, generalmente no hay necesidad de desasignar los recursos ya que todo el proceso se termina y todo lo que tenía abierto y asignado se cierra y desasigna automáticamente por el sistema. – Grishka

1

Debe ponerse Excepción.

prueba este código:

 try{ 
     MediaPlayer mplayer = MediaPlayer.create(contextTop, R.raw.<your sound>); 
     mplayer.start(); 
    }catch(Exception e){ 
     Log.d("<your TAG here>" , "error: " + e); 
    } 
Cuestiones relacionadas