2011-05-03 45 views
5

我的資產目錄中有一個音頻文件。資產/音頻/ dance.mp3。從上下文資產中的Uri加載MediaPlayer

如果我運行context.getAssets()。list(「audio」);它出現了。

但是當我嘗試使用MediaPlayer.create(context,uri)時,它總是失敗並返回null。

沒有這似乎工作

private void tryLoad(String path,Context context) 
{ 
    Uri uri = Uri.parse(path); 
    this.audioPlayer = MediaPlayer.create(context,uri); 
    if (this.audioPlayer == null) 
    { 
     Log.d(TAG, "loadAudio: audioPlayer is null. current assets"+ uri.toString()) ; 
    } 
    else 
    { 
     Log.d(TAG, "loadAudio: WORKED"+ uri.toString()) ; 
    } 

} 
public void loadAudio(Context context) 
{ 
    if (this.audioPlayer != null) 
     return; 
    if (this.audioFile != null && this.audioFile.length() >0) 
    { 
     try 
     { 
      tryLoad("/dance.mp3",context); 
      tryLoad("dance.mp3",context); 
      tryLoad("audio/dance.mp3",context); 
      tryLoad("/audio/dance.mp3",context); 
      tryLoad("assets/audio/dance.mp3",context); 
      tryLoad("/assets/audio/dance.mp3",context); 
      tryLoad("\\dance.mp3",context); 
      tryLoad("dance.mp3",context); 
      tryLoad("audio\\dance.mp3",context); 
      tryLoad("\\audio\\dance.mp3",context); 
      tryLoad("assets\\audio\\dance.mp3",context); 
      tryLoad("\\assets\\audio\\dance.mp3",context); 
     } 
     catch (Exception e) 
     { 
      Log.d(TAG, "loadAudio exception: " + e.getMessage()); 
     } 
    } 
} 

回答

3

我認爲你可以做到這一點,因爲MediaPlayer期望一個URI,它不可能爲資產的文件創建一個URI。嘗試使用MediaPlayer.setDataSource(FileDescriptor)方法創建一個MediaPlayer對象並將其設置爲一個數據源。您可以使用AssetManager.openFd()方法獲得FileDescriptor對象,然後爲返回的對象調用AssetFileDescriptor.getFileDescriptor()方法。

我還沒有試過這個解決方案,所以這只是一個想法。但我希望它能起作用。

+0

哎呀..沒看到你的答案(剛編輯舊的),反正 - +1速度更快:) – MByD 2011-05-17 20:32:42

+0

@ madmik3嗨,你可以獎勵懸賞這個如果你認爲這是正確的答案。否則,您的賞金可能會丟失,因爲它在您接受答案時不會自動授予。 – Michael 2011-05-24 05:01:58

0

你需要把文件中的res/raw文件夾,然後用加載它:

MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);

來源:Android documentation

+0

,要求他們的文件是硬編碼,這就是我想要避免的。 – madmik3 2011-05-22 14:47:21

+0

對不起,您的原始問題並不清楚。你是否試過這個:'mp = new MediaPlayer(); AssetFileDescriptor afd = getAssets()。openFd(「dance.mp3」); mp.setDataSource(afd.getFileDescriptor());' – 2011-05-22 15:11:36