[英]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.