2012-03-27 99 views
1

我已经做了像用户点击按钮然后声音播放。但是现在我无法在点击后听到声音。我不知道为什么?Android:为什么我点击后无法播放按钮上的声音?

这是我用来播放声音的代码。

代码:

case R.id.lockView: 
     playSound(R.raw.dooropen); 
     break; 
    } 

public void playSound(int resources){ 
    boolean mStartPlaying = true; 
    if (mStartPlaying==true){ 
     mPlayer = new MediaPlayer(); 
     Uri uri = Uri.parse("android.resource://com.project.iMystick/" + resources); 
     try{ 
      mPlayer.setDataSource(getApplicationContext(),uri); 
      mPlayer.prepare(); 
      mPlayer.start(); 
     } 
     catch (IOException e){ 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 
    } 
    else{ 
     // stopPlaying(); 
     //rePlay.setText("Replay"); 
     mPlayer.release(); 
     mPlayer = null; 
    } 
    mStartPlaying = !mStartPlaying; 
} 

而且一些点击后,我得到了在logcat的这种类型的错误消息:

登录:

03-27 16:15:02.737: ERROR/MediaPlayer(1057): Error (-19,0) 
03-27 16:15:03.858: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12 
03-27 16:15:03.858: ERROR/AudioFlinger(34): not enough memory for AudioTrack size=32832 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): AudioTrack (0x12abf8, size=1048576) 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  0: 0012ac10 | 0x00000000 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  1: 0012aca0 | 0x00008040 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  2: 0012b5a8 | 0x00010080 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  3: 0012bec8 | 0x000180C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  4: 0012c7f0 | 0x00020100 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  5: 0012d1f0 | 0x00028140 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  6: 0012db20 | 0x00030180 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  7: 00136448 | 0x000381C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  8: 0013ee00 | 0x00040200 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  9: 0000de10 | 0x00048240 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 10: 0012b708 | 0x00050280 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 11: 00022c70 | 0x000582C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 12: 000234c0 | 0x00060300 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 13: 00115e38 | 0x00068340 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 14: 00117a80 | 0x00070380 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 15: 00118798 | 0x000783C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 16: 00042228 | 0x00080400 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 17: 0004bd48 | 0x00088440 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 18: 00055998 | 0x00090480 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 19: 0005f5f0 | 0x000984C0 | 0x00003040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 20: 000712b0 | 0x0009B500 | 0x00008040 | A 
03-27 16:15:03.867: ERROR/AudioTrack(34): AudioFlinger could not create track, status: -12 
03-27 16:15:03.867: ERROR/AudioSink(34): Unable to create audio track 
03-27 16:15:03.877: ERROR/MediaPlayer(1057): error (-19, 0) 

enter code here 

回答

4

你需要释放()的媒体播放器,否则资源不释放,并且很快你就会失去记忆(因为你下次再分配它们)。 所以,我认为你可以播放两次甚至三次......但没有多次释放资源

建议一旦MediaPlayer对象不再被使用,立即调用release()以便使用资源通过与MediaPlayer对象关联的内部播放器引擎可以立即释放。资源可能包括硬件加速组件等单体资源,以及调用release()失败可能导致MediaPlayer对象的后续实例退回到软件实现或完全失败。 See this link

+0

是的谢谢。它解决了我的问题 – 2012-03-27 12:00:21

1

我认为问题是,你didint等到第一个完成(或停止它)开始第二个.. 尝试收听前一个完成时,然后启动下一个..你可能会使用setOnCompletio nListener。

类似的问题: android playing two songs problem

代码:

package ooo.iii; 

    import java.io.IOException; 


    import android.app.Activity; 
    import android.media.MediaPlayer; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 

    public class Test_audioActivity extends Activity { 
     /** Called when the activity is first created. */ 
     Button btn; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
    //  setContentView(R.layout.main); 
      setContentView(R.layout.main); 
      btn=(Button)findViewById(R.id.ss); 

      btn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        playSound(R.raw.musi); 

       } 
      }); 

     } 



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

      mPlayer = new MediaPlayer(); 
     Uri uri = Uri.parse("android.resource://ooo.iii/" + resources); 

      mPlayer.setDataSource(getApplicationContext(),uri); 
      mPlayer.prepare(); 
      mPlayer.start(); 

    } 
    else{ 
     // stopPlaying(); 
     //rePlay.setText("Replay"); 
     mPlayer.release(); 
     mPlayer = null; 
    } 
    mStartPlaying = !mStartPlaying; 


    } 
    catch (IOException e){ 
     Log.e("ERR", "prepare() failed"); 
    } 
    } 



} 

你需要改变:

1-源@ RES /生/穆西..到你

2- res/layout/main.xml中按钮的id从ss到你的..

3 Uri uri = Uri.parse(“android.resource://ooo.iii/”+ resources);修复包名到你

这就是全部。我测试了真实的设备,然后点击多次,并获得新的声音上面以前仍处于播放状态

+0

我得到了你的观点,但如果想连打它第二次如果它不停止呢? – 2012-03-27 11:00:51

+0

在这种情况下..使用mediaplayer的另一个实例..重点是,如果它与其他东西忙碌不要使用相同的对象.. – 2012-03-27 11:03:07

+0

好吧那么它对我有用吗?我的意思是,如果我继续点击同一个按钮呢? – 2012-03-27 11:07:29

1

MediaPlayer的设计目的并不在于您试图使用它的方式。这就是为什么你面临这个问题。

MediaPlayer正在`不是一个好的选择当你在打小的声音效果,用户可以很快的多个按钮点击,你必须创建为所有这些不同步发生一个MP物体和只要你点击按钮。去SoundPool类,它允许您保持较小的声音加载到内存中,并且您可以随时播放它们,而不会在媒体播放器中感受到任何延迟。http://developer.android.com/reference/android/media/SoundPool.html这里是一个很好的教程:http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html

+0

感谢您的答案,但我已经解决了这个问题。 – 2012-03-27 12:46:34

+0

如果可以,请使用soundPool。多媒体播放器实例将开始落后于处理能力较低的手机。我遇到了问题,不得不切换到SoundPool – Akhil 2012-03-27 17:08:34

0

我有同样的问题,我解决它通过使用release()方法的OnCompletionListener:

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resource); 
     mp.start(); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       mp.release(); 
      } 
     });