无法启动Android MediaPlayer onCompletion

And*_*rew 14 android android-mediaplayer

我正在尝试使用android MediaPlayer类播放一些声音.

这是代码

MediaPlayer mp = new MediaPlayer(); 
mp.setDataSource(context, Uri.parse(soundUrl)); 
mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mp.setLooping(false); 
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    @Override 
            public void onCompletion(MediaPlayer mp) { 
                Log.i(LOGTAG, "onComplete hit"); 
                mp.stop(); 
                mp.release(); 
            } 
    });         

mp.prepare(); 
mp.start();
Run Code Online (Sandbox Code Playgroud)

此代码在服务中运行,但由于某种原因,声音播放正常,但放入onCompletion的任何内容似乎都没有触发.然后我在logcat中收到媒体播放器未发布的消息.我对这个问题感到茫然.

我在galaxy nexus 4.0.4 stock rom上运行这个测试.

我还注意到声音最后会被剪掉.

aja*_*n81 33

它实际上很简单(但很傻).调用start()后设置监听器,如下所示:

ediaPlayer mp = new MediaPlayer(); 
mp.setDataSource(context, Uri.parse(soundUrl)); 
mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mp.setLooping(false); 
mp.prepare(); 
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    @Override 
            public void onCompletion(MediaPlayer mp) { 
                Log.i(LOGTAG, "onComplete hit"); 
                mp.stop(); 
                mp.release(); 
            } 
    });         
Run Code Online (Sandbox Code Playgroud)

  • 你能解释为什么在设置完成监听器之前调用start()很重要吗?这是Android的怪癖吗? (5认同)
  • 但我没有看到任何证据支持为什么这会解决Android源代码中的问题.事实证明我的根本问题是MediaPlayer在完成播放之前就已经过GC了,我已经添加了一个更详细的答案:) (2认同)

Ara*_*raw 3

我是这样的:

    video.setOnCompletionListener(this);
    IntroClip.execute(video);
}

@Override
public void onCompletion(MediaPlayer mp){
    Button LoginButton;
    Button CreateAccount;
    Button RecoverPass;

    setContentView(R.layout.loginmenu);
    Spin = (ProgressBar)findViewById(R.id.Spinner);

    mp.release();       
}
Run Code Online (Sandbox Code Playgroud)

  • @Andrew 如果它不起作用,它是如何被接受的答案?你成功了吗?如果是,怎么办? (2认同)
  • @smitalm 在设置监听器之前调用 start() 。 (2认同)