android从sd-card播放声音

时间:2011-12-09 11:07:21

标签: android audio

我需要从SD卡播放声音。我有方法必须这样做,但它不起作用。

当我使用这种方法时:

public class AudioPlayService extends Service

{
    MediaPlayer mMediaPlayer;
..............
    public void soundplay(String adr)
        {
            mMediaPlayer = new MediaPlayer();
            try
            {
                if (mMediaPlayer.isPlaying())
                {
                    mMediaPlayer.reset();
                }
                mMediaPlayer.setDataSource(adr);
                mMediaPlayer.prepare();
            } catch (IOException e)
            {
            }
            mMediaPlayer.start();
            mMediaPlayer.setOnCompletionListener(new OnCompletionListener()
            {
                @Override
            public void onCompletion(MediaPlayer mp)
            {
                mp.release();
                mp = null;
            }
        });
    }

String adr - 它是在sd上提交文件的绝对路径。

然后我称之为:

AudioPlayService s = new AudioPlayService();
s.soundplay(iA.getSdDir() + "Files/Numbers/0.mp3");

我得到一个错误的:

12-09 13:04:13.829: E/MediaPlayer(16997): error (1, -2147483648)
12-09 13:04:13.829: E/MediaPlayer(16997): start called in state 0
12-09 13:04:13.829: E/MediaPlayer(16997): error (-38, 0)
12-09 13:04:13.839: E/MediaPlayer(16997): Error (-38,0)

3 个答案:

答案 0 :(得分:0)

player.start()放入try,catch块。因为如果玩家没有准备你的歌曲,你仍然在调用start method.start方法只在回放准备好后调用, 意味着准备就是成功。另一件事就是当你的玩家不再玩时你必须释放媒体播放器。否则就会有很多玩家对象在后面运行。

答案 1 :(得分:0)

出于某种原因,您的setDataSource()Prepare()失败了。因此,在异常之后,start()正在给出错误,因为播放器未处于准备状态。在catch块中添加print语句以了解异常是什么。并将start()移到try catch块中。

mMediaPlayer = new MediaPlayer();
try
{
  if (mMediaPlayer.isPlaying())
  {
     mMediaPlayer.reset();
  }
  mMediaPlayer.setDataSource(adr);
  mMediaPlayer.prepare();
  mMediaPlayer.start();
} catch (IOException e)
{
  e.printStackTrace();
}

答案 2 :(得分:0)

我自己尝试了你的代码:

当我只放"sdcard/1.mp3"

时,我的工作正常

您确保路径正确

s.soundplay(iA.getSdDir() + "Files/Numbers/0.mp3");

注意:     如果您尝试制作方法soundplay以便停止以前的音频并播放新的音频文件,那么更好的方法是not在该方法中执行此操作

mMediaPlayer = new MediaPlayer();

将它放在构造函数中。 否则每次调用s.soundplay(path)时,您都会听到以前的音频和新音频。即,上一个不会停止