声音没有在onTouchListener上重放

时间:2015-06-03 20:18:36

标签: java android

所以我有一个按钮,当按下时,会发出声音。但是,它似乎没有重置"当我再次按下按钮时再也不会播放那个声音。我得到了

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;
        }
    });
}

1 个答案:

答案 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;
        }
    });
}