Android MediaPlayer 停止后不会再次启动

标签 android audio media-player

我想播放一个声音。第一次它运行良好,但如果我停止它并想重新启动它,什么也没有发生...有什么想法吗?

final MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sex);
ImageButton andvib = (ImageButton)findViewById(R.id.vib_toggle);
final AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
andvib.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        am.setStreamVolume(AudioManager.STREAM_MUSIC, vol, 0);
        Vibrator vibr = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
        vibr.cancel();
        if(vibrating==false) {
            if(style == 0)
                vibr.vibrate(durat, 0);
            if(style == 1){
                vibr.vibrate(staccato, 0);
            }
            if(style == 2){
                vibr.vibrate(wild, 0);
            }
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            mp.start();
            mp.setLooping(true);
            vibrating = true;
        }
        else {
            vibrating = false;
            mp.stop();
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            vibr.cancel();
        }
    }
});

最佳答案

在使用 MediaPlayer 时,您应该始终引用您可以在此处看到的状态变化图:

http://developer.android.com/reference/android/media/MediaPlayer.html

从图中可以看出,在调用 MediaPlayer 的 stop() 后,它会进入 Stopped 状态,您需要再次调用 prepare() 将其移动到 Prepared 状态,然后再调用 play()。

请记住,准备工作可能需要很长时间,所以一直这样做可能会导致用户体验不佳,尤其是当您从主线程进行准备时(当 MediaPlayer 正在准备时,UI 会卡住)。如果你经常播放声音,你真的应该只 prepare() 一次,然后始终保持 Started、Paused 或 PlaybackCompleted 状态。

Bruno Oliveira,Google 开发人员计划工程师

关于Android MediaPlayer 停止后不会再次启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474501/

相关文章:

android - RecyclerView ItemTouchHelper 滑动移除动画

java - 如何在使用 gradle 的编译阶段添加依赖 jar 文件?

java - 获取计算机的音频输出

javascript - 如果使用Knockout注册了暂停事件,为什么无法暂停音频

Android 几个 MediaPlayer

android - 我可以像在 Swift 中一样在 Kotlin 中进行扩展吗

Android Studio 不允许我更改 SDK 位置

android - 有没有好的安卓录音库?

java - 如何在 Java/JavaFX 中通过 MediaPlayer 播放内存中的声音

Android:同时播放和录制视频