2011-03-09 183 views
0

我有一个媒体播放器类的小问题。我有一个按钮,按下它会播放声音。问题是,当我按下按钮和播放声音时,如果我按了很多次媒体播放器死机,然后没有声音播放,我得到以下错误:mediaplayer死亡android

ERROR/MediaPlayer(3960): error (-19, 0) 
ERROR/AudioTrack(3931): AudioFlinger could not create track, status: -12 
ERROR/AudioSink(3931): Unable to create audio track 

下面的代码:

Button b = (Button)findViewById(R.id.button); 
     b.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       AssetFileDescriptor afd; 
       try { 

        afd = getAssets().openFd("bassdrum6.mp3"); 
        player = new MediaPlayer(); 
        player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
        player.prepare(); 
        player.start(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

我不知道什么是错在这里。我需要一些帮助。

在此先感谢。

回答

0

你会想,如果你想在按钮被按下

Button b = (Button)findViewById(R.id.button); 
b.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (global.toggleOnOff == false) { 

      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       //what you want to happen when they touch the button 
      } 
      else if(event.getAction() == MotionEvent.ACTION_UP) { 
       //what you want to happen when they let go of the button 
      } 
     } 

     return false; 
    } 
}); 
+0

我也会使用声音池而不是媒体播放器。这会照顾你的错误。这里有一个关于如何使用它的好教程。 http://thenewboston.org/watch.php?cat=6&number=79 – MinceMan 2011-12-30 14:05:41

1

可能因为您同时创建了多个MerdiaPlayer对象(我期望Android API代码应该能够很好地处理这个问题)。 总而言之,您可以在您的代码中建立一个检查来验证mediaplayer是否已经创建。 举一个很好的例子: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html

另外,最好是扩展你的实现,以便在它完成它的工作时释放mediaplayer。就像清理之后的对象被释放。

+0

感谢您的回答也发挥触摸监听使用。我会看看它。 – madcoderz 2011-03-09 14:38:30

+0

以及关于媒体播放器死亡的问题已修复。但是当我播放声音时我仍然会延迟。我刚才发现,当按钮被释放而不是按下时,播放声音。有什么办法可以解决这个问题吗? – madcoderz 2011-03-09 15:41:12

+0

是不是因为onclick甚至只在完成点击循环后才会触发? – 2013-02-15 16:27:16