如何让安卓媒体播放器播放声音?

4

我不知道为什么它不起作用,logcat中没有错误记录,但是我听不到声音。

public static void DeclararSonido(int numero, Context contexto){
    switch(numero){
    case 0:
        mp = MediaPlayer.create(contexto, R.raw.alan);
        break;          
    }
}

public static void TocarPiedra( int posicion, Context contexto){
    DeclararSonido(posicion, contexto);


    mp.start();
    mp.stop();
    mp.release();
}
public static void TocarSirena(Context contexto){
    MediaPlayer mp2= MediaPlayer.create(contexto, R.raw.doh);


    mp2.start();
    mp2.stop();
    mp2.release();

}

如果我删除mp2.stop();mp2.release();以及mp.stop();mp.release();,应用程序会播放声音,但是文件没有被释放...

什么问题? - Android Developer
"Alomejor es por la extension" 可能是因为文件扩展名的问题。对于讲英语的人来说,西班牙语注释并不是很有帮助。请翻译它们或将其从代码中删除。 - Andrew Thompson
最好编辑原始问题http://stackoverflow.com/questions/16276652/mediaplayer-no-works-relese-and-stop-error,以更好地适应Stack Overflow标准,而不是再次发布几乎相同的内容。 - laalto
看,这个问题对于一些人来说是关闭了,我不知道为什么。 - CristianCV
@CristianCV,如果已关闭的问题通过编辑符合 SO 规范,则可以重新开放。有关更多信息,请参见 FAQ http://stackoverflow.com/faq。 - laalto
2个回答

11

你肯定不希望开始然后立刻停止。

问题在于你在相继执行这些操作:

mp.start();      // starts playback
mp.stop();       // .. then stops immediately ..
mp.release();

你应该调用start方法,然后当声音播放完成时释放。你可以使用完成事件来挂接一个监听器,在那里释放:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
    public void onCompletion(MediaPlayer player) {
       player.release();          
    }
})

2

Mediaplayer.create():- 创建一个新的mediaplayer对象。这个对象从raw文件夹中获取音乐文件,在调用start()方法时将播放该音乐。

Mediaplayer.start():- 如果Mediaplayer对象已初始化,则*开始播放音乐*。否则会引发异常。

Mediaplayer.stop() :-*停止播放*当前使用该对象播放的音乐。

Mediaplayer.release():- 音乐文件路径与Mediaplayer对象不再关联,因此需要重新分配内存等操作。请注意,Mediaplayer不会变为null

在这里查看mediaplayer状态图

现在您正在开始播放歌曲并直接停止它。我建议您创建按钮,当按下按钮时停止mediaplayer。

另一种方法已经由Miky Dinescu提供,即设置setoncompletelistner。

因此,请执行以下操作:

public static void DeclararSonido(int numero, Context contexto){
    switch(numero){
    case 0:
        mp = MediaPlayer.create(contexto, R.raw.alan);
        break;          
    }
}

public static void TocarPiedra( int posicion, Context contexto){
    DeclararSonido(posicion, contexto);


    mp.start();
    mp.setOnCompleteListener(new OnCompleteListener(){
    public void OnCompletion(MediaPlayer mp){
    mp.stop();
    mp.release();
    }});
}
public static void TocarSirena(Context contexto){
    MediaPlayer mp2= MediaPlayer.create(contexto, R.raw.doh);

    //Alomejor es por la extension

    mp2.start();
    mp2.setOnCompleteListener(new OnCompleteListener(){
    public void OnCompletion(MediaPlayer mp){
    mp2.stop();
    mp2.release();
    }});


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接