[英]Sound not replaying on onTouchListener
因此,我有一個按鈕,按住該按鈕可播放聲音。 但是,當我再次按下該按鈕時,它似乎並沒有“重置”,也再也不會播放該聲音。 我得到一個
E / MediaPlayer:開始以狀態0調用E / MediaPlayer:錯誤(-38,0)
當我嘗試再次按住該按鈕時,出現日志錯誤。 這是我的代碼:
@Override
protected void onCreate(Bundle savedInstanceState) {
final MediaPlayer bark = MediaPlayer.create(this, R.raw.bark);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playSound = (Button) findViewById(R.id.btn);
playSound.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(!bark.isPlaying()) bark.start();
break;
case MotionEvent.ACTION_UP:
if(bark.isPlaying()) bark.stop();
break;
}
return true;
}
});
}
除了調用start / stop之外,您還可以使用seekTo()
調用start / pause:
case MotionEvent.ACTION_DOWN:
if(!bark.isPlaying()) bark.start();
break;
case MotionEvent.ACTION_UP:
if(bark.isPlaying()){
bark.pause();
bark.seekTo(0);
}
break;
如果要使用開始/停止,請確保在再次調用start()之前先調用prepare()。
您的代碼無法正常工作的原因是,根據狀態圖, stop()會停止播放並使MP處於停止狀態。 在開始下一次播放之前,您應該調用prepare(),然后再次啟動。
編輯:將您的音樂文件放在資產文件夾中,並使用文件描述符。 這樣,您可以重置MP並重播:
使用START / STOP:
@Override
protected void onCreate(Bundle savedInstanceState) {
AssetManager assetManager=Context.getAssets();
AssetFileDescriptor fileDescriptor = assetManager.openFd("bark.mp3"); //replace with right extension
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playSound = (Button) findViewById(R.id.btn);
playSound.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(!bark.isPlaying()){
bark.reset();
bark.setDataSource(fileDescriptor.getFileDescriptor());
bark.prepare();
bark.start();
}
break;
case MotionEvent.ACTION_UP:
if(bark.isPlaying())
bark.stop();
break;
}
return true;
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.