所以我有一个按钮,当按下时,会发出声音。但是,它似乎没有重置"当我再次按下按钮时再也不会播放那个声音。我得到了
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;
}
});
}
答案 0 :(得分:0)
您可以使用seekTo()
调用开始/暂停:
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()。
您的代码无效的原因是因为根据state diagram stop()停止播放并将MP置于停止状态。在下次开始播放之前,你应该调用prepare()然后再次启动()。
编辑:将您的音乐文件放在assets文件夹中并使用文件描述符。这样您就可以重置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;
}
});
}