2010-07-30 15 views
41

Ich versuche, eine Sound-Datei auf einen Klick auf eine Schaltfläche zu spielen. Der Ton ist nur 1 Sekunde lang. Es spielt gut die ersten paar Male, die ich den Knopf klicke, aber nach einer Weile gibt es einen NullPointerException. Hier ist der Code:Android - Sound auf Knopf klicken - Nullzeiger Ausnahme

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

Und hier ist die Ausnahme:

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

nicht sicher, ob es hilft, aber vielleicht einen mp.reset() nach Abschluss versuchen? –

+0

Ja, es hat geholfen! Vielen Dank! – Chris

+0

Wenn Sie möchten, dass die Ressourcen automatisch verwaltet werden, damit Sie 'MusicManager.getInstance(). Play (this, R.raw.my_sound);' usw. aufrufen können, könnte diese Bibliothek für Sie bestimmt sein: https: // github .com/delight-im/Android-Audio – caw

Antwort

4

Es könnte Ihr Problem lösen,

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

Funktioniert immer noch für die ersten paar Klicks, und gibt dann eine Nullzeiger-Ausnahme, besonders wenn ich schnell hintereinander auf Schaltflächen klicke. – Chris

+0

können Sie versuchen, 1) Putting überprüfen vor dem Start. Ich meine, überprüfen Sie, ob der Player im Stadium ist, dann führen Sie diese Anweisung nicht aus mp = MediaPlayer.create (Test.this, R.raw.mysound); mp.start(); oder 2) make mp als lokale Variable – sohilv

101

Vielen Dank für Ihre Antworten! Bin dankbar!

Hier ist, wie ich es endlich geschafft, um es Arbeit zu bekommen:

  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

scheint wie vielleicht der .setOnCompletionListener sollte vor dem .Start nicht nach (?) –

+0

Ich stimme mit Ryan. – Carcamano

+0

änderte die Reihenfolge der Anrufe – WarrenFaith

0

Wenn immer noch das Problem nicht gelöst dann versuchen, wie es mir helfen.

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

    } 

Genießen. :)

24

Sie können auch versuchen:

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

Scheint, dass dies die bessere Methode ist, um einen wiederholten, kurzen Ton beim Klicken auf die Schaltfläche zu erzeugen (anstatt jedes Mal einen Media Player zu erstellen/zu zerstören). Vergessen Sie nicht, ein 'soundPool.release();' in Ihrem 'onDestroy' (oder wo auch immer Sie die Aktivität aufräumen) zu machen. – Alconja

+0

@Alconja Meiner Erfahrung nach gibt es keine Garantie, dass OnDestroy tatsächlich aufgerufen wird (d. H. Der Android Task Killer tötet normalerweise meine App ohne Warnung). – Michael

+0

@Michael, wenn die App auf diese Weise beendet wird, ist es in der Regel nicht notwendig, Ressourcen freizugeben, da Ihr gesamter Prozess beendet wird und alles, was er geöffnet und zugewiesen hat, automatisch vom System geschlossen und freigegeben wird. – Grishka

1

Sie Exception fangen sollte.

versuchen diesen Code:

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