Java 声音不在侦听器上重放

Java 声音不在侦听器上重放,java,android,Java,Android,所以我有一个按钮,当按下时,会发出声音。但是,当我再次按下按钮时,它似乎不会“重置”,也不会再次播放该声音。我得到一份工作 E/MediaPlayer﹕ 在状态0下调用start E/MediaPlayer﹕ 错误(-38,0) 再次按下按钮时,日志中出现错误。这是我的密码: @Override protected void onCreate(Bundle savedInstanceState) { final MediaPlayer bark = MediaPlayer.create(th

所以我有一个按钮,当按下时,会发出声音。但是,当我再次按下按钮时,它似乎不会“重置”,也不会再次播放该声音。我得到一份工作

E/MediaPlayer﹕ 在状态0下调用start 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;
        }
    });
}

您可以使用
seekTo()
调用开始/暂停,而不是调用开始/停止:

如果要使用start/stop,请确保在再次调用start()之前调用prepare()

代码无法工作的原因是根据stop()停止播放,并将MP置于停止状态。在开始下一次播放之前,应该调用prepare(),然后再次启动()

编辑:将音乐文件放在资产文件夹中,并使用文件描述符。通过这种方式,您可以重置MP并重播:

使用启动/停止:

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

你忘了权限?你能告诉我在清单中需要什么权限吗?请将循环设置为true,并在创建媒体播放器后立即调用prepare谢谢你,如果我有足够的代表,我会给你投票!出于某种原因,在start()之前调用prepare()是不起作用的,即使我将prepare()放在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;
        }
    });
}