8

我正在制作一个应该用 mediaPlayer 播放一些声音的应用程序。这是我使用的代码:

String[] name = {"sonar_slow","sonar_medium","sonar_fast"};
    String link = "/res/raw/" + name[state-1] + ".mp3";

    try {
        player.setDataSource(link);
        player.prepare();
        player.start();
    } catch(Exception e) {
        e.printStackTrace();
    }

我也试过这个:

        if(state==1){
            player.create(this, R.raw.sonar_slow);
        }else if(state==2){
            player.create(this, R.raw.sonar_medium);
        }else if(state==3){
            player.create(this, R.raw.sonar_fast);
        }
        player.start();

但以上都不起作用。我的应用程序没有崩溃,但没有播放声音。有任何想法吗 ?

4

4 回答 4

29

有两个问题。

问题 1

您不能以这种方式引用项目 /res/raw 目录中的资源。您项目目录中的文件“/res/raw/sonar_slow.mp3”未存储在您的 apk 中的“/res/raw/sonar_slow.mp3”中。而不是以下内容:

MediaPlayer mp = MediaPlayer.create(this);  
mp.setSource("sonar_slow");

你需要使用

MediaPlayer mp = MediaPlayer.create(this, R.raw.sonar_slow); 

问题 2

以下是错误的:它调用了一个不修改player.

player.create(this, R.raw.sonar_slow); 

您应该改为致电

player = MediaPlayer.create(this, R.raw.sonar_slow);

完整的解决方案

下面是一个封装了 MediaPlayer 的可重用 AudioPlayer 类。这是从“Android 编程:大书呆子牧场指南”略微修改的。它确保记得清理资源

package com.example.hellomoon;

import android.content.Context;
import android.media.MediaPlayer;

public class AudioPlayer {

    private MediaPlayer mMediaPlayer;

    public void stop() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    public void play(Context c, int rid) {
        stop();

        mMediaPlayer = MediaPlayer.create(c, rid);
        mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                stop();
            }
        });

        mMediaPlayer.start();
    }

}
于 2013-08-15T14:41:35.270 回答
5

如何使用 MediaPlayer 播放文件:

MediaPlayer mp = MediaPlayer.create(this, R.raw.mysound); // sound is inside res/raw/mysound
mp.start();

这是一个如何使用 Android MediaPlayer播放声音的简单示例。

你有两个按钮帽子每个播放不同的声音。声音的选择和实际播放是在 manageSound() 方法中完成的。声音“你好”、“再见”和“什么”在res/raw目录中:

MediaPlayer mp        = null;
String hello         = "Hello!";
String goodbye        = "GoodBye!";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button buttonHello = (Button) findViewById(R.id.idHello);
    buttonHello.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            managerOfSound(hello);
        } // END onClick()
    }); // END buttonHello


    final Button buttonGoodBye = (Button) findViewById(R.id.idGoodBye);
    buttonGoodBye.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            managerOfSound(goodbye);
        } // END onClick()
    }); // END buttonGoodBye
} // END onCreate()


protected void manageSound(String theText) {
    if (mp != null) {
        mp.reset();
        mp.release();
    }
    if (theText.equals(hello))
        mp = MediaPlayer.create(this, R.raw.hello);
    else if (theText.equals(goodbye))
        mp = MediaPlayer.create(this, R.raw.goodbye);
    else
        mp = MediaPlayer.create(this, R.raw.what);
    mp.start();
}

取自这里:http ://www.badprog.com/android-mediaplayer-example-of-playing-sounds

此外,我强烈建议使用 SoundPool而不是 MediaPlayer,以获得更好的性能和可用性。

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

还请检查您的声音是否静音- 我知道这听起来很愚蠢,但它发生在我们最好的人身上;)

于 2013-08-15T14:31:47.517 回答
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();
于 2013-08-15T14:40:00.877 回答
-1

确保您只在文件完成准备后播放。

于 2013-08-15T14:31:25.887 回答