2010-07-30 2 views
41

J'essaie de lire un fichier audio en cliquant sur un bouton. Le son dure à peine 1 sec. Il joue bien les premières fois que je clique sur le bouton, mais après un certain temps, il donne un NullPointerException. Voici le code:Android - lire le son sur un bouton - Exception du pointeur nul

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

Et voici l'exception:

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

ne sais pas si ça aide, mais peut-être essayer un mp.reset() à la fin? –

+0

Oui, ça a aidé! Je vous remercie! – Chris

+0

Si vous voulez que les ressources soient gérées automatiquement, afin que vous puissiez appeler 'MusicManager.getInstance(). Play (this, R.raw.my_sound);' etc., cette bibliothèque pourrait être pour vous: https: // github .com/delight-im/Android-Audio – caw

Répondre

4

Il pourrait résoudre votre problème,

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

Fonctionne toujours correctement pour les premiers clics, puis donne une exception de pointeur nul, en particulier lorsque je clique sur les boutons rapidement successivement. – Chris

+0

pouvez-vous essayer, 1) mettre vérification avant de commencer. je veux dire vérifier si le joueur est sur la scène, puis ne pas exécuter cette instruction mp = MediaPlayer.create (Test.this, R.raw.mysound); mp.start(); ou 2) faire mp comme variable locale – sohilv

101

vous Merci pour vos réponses! Appréciez-le!

Voici comment je finalement réussi à le faire fonctionner:

  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

semble que peut-être le .setOnCompletionListener devrait venir avant le .start pas après (?) –

+0

Je suis d'accord avec Ryan. – Carcamano

+0

a changé l'ordre des appels – WarrenFaith

0

Si votre problème encore pas résolu alors essayez cela comme il me aider.

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

    } 

Profitez-en. :)

24

Vous pouvez aussi essayer:

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

Il semble que ce soit la meilleure façon de le faire lors de la lecture d'un son court et répétitif sur un clic de bouton (plutôt que de créer/détruire un lecteur multimédia à chaque fois). N'oubliez pas de faire un 'soundPool.release();' dans votre 'onDestroy' (ou partout où vous nettoyez l'activité). – Alconja

+0

@Alconja D'après mon expérience, il n'y a pas de garantie onDestroy sera effectivement appelé (c'est-à-dire le tueur de tâche Android tue généralement mon application sans avertissement). – Michael

+0

@Michael chaque fois que l'application est détruite de cette façon, il n'est généralement pas nécessaire de libérer des ressources lorsque l'ensemble de votre processus est terminé et que tout ce qu'il a ouvert et alloué est fermé et désalloué automatiquement par le système. – Grishka

1

Vous devez attraper exception.

essayer ce code:

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