2011-12-09 295 views
0

我需要從SD卡播放聲音。我有方法必須這樣做,但它不起作用。從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) 
+0

確保您的路徑正確 – Abhi

+0

一旦你得到答案,請接受你認爲最好的答案之一。 – Karthik

回答

0

我自己試了一下你的代碼:

礦或工作得很好,當我把剛剛"sdcard/1.mp3"

您確保路徑是正確的不

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

注: 如果您正試圖讓你的方法soundplay,以停止以前的音頻和播放新的音頻文件,那麼最好是not在此方法內執行此操作

mMediaPlayer = new MediaPlayer(); 

將其置於構造函數中。 否則每次調用s.soundplay(path)時您都會聽到以前的音頻和新的音頻。即,上一個不會停止

0

player.start()把try內,catch塊。因爲如果播放器沒有準備好你的歌曲,你仍然在調用start method.start方法只在播放準備就緒後被調用, 意味着準備成功。另一件事是當你的播放器不再播放時你必須釋放媒體播放器。否則有很多玩家對象在後臺運行。

0

由於某種原因,您的setDataSource()Prepare()失敗。因此,在例外之後,start()發生錯誤,因爲玩家未處於準備狀態。在catch塊中添加打印語句以瞭解什麼是異常。並將start()移入try catch塊。

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