2011-08-30 121 views
8

我正在嘗試使用相同的媒體播放器,但更改了數據源。這裏是我想要做的事: 使用現有MediaPlayer更改音頻播放的數據源?

private MediaPlayer mMediaPlayer; 

    public void pickFile1() { 
     initMediaPlayer("myfile1.mp3"); 
    } 

    public void pickFile2() { 
     initMediaPlayer("myfile2.mp3"); 
    } 

    private void initMediaPlayer(String mediafile) { 
    // Setup media player, but don't start until user clicks button! 
    try { 
     if (mMediaPlayer == null) { 
      mMediaPlayer = new MediaPlayer(); 
     } else { 
      mMediaPlayer.reset(); // so can change data source etc. 
     } 
     mMediaPlayer.setOnErrorListener(this); 
     AssetFileDescriptor afd = getAssets().openFd(mediafile); 
     mMediaPlayer.setDataSource(afd.getFileDescriptor()); 
    } 
    catch (IllegalStateException e) { 
     Log.d(TAG, "IllegalStateException: " + e.getMessage()); 
    } 
    catch (IOException e) { 
     Log.d(TAG, "IOException: " + e.getMessage()); 
    } 
    catch (IllegalArgumentException e) { 
     Log.d(TAG, "IllegalArgumentException: " + e.getMessage()); 
    } 
    catch (SecurityException e) { 
     Log.d(TAG, "SecurityException: " + e.getMessage()); 
    } 

    mMediaPlayer.setOnPreparedListener(this); 
    mMediaPlayer.prepareAsync(); // prepare async to not block main thread 
    mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); // Keep playing when screen goes off! 
} 

我只是把這個當我想換一個新的媒體文件。它似乎並沒有成功改變數據源。第一個問題:是否可以這樣做,還是必須發佈媒體播放器併爲每個新文件創建一個新媒體播放器?如果可能的話,爲什麼我的代碼不能正常工作?

編輯:好吧,發佈和重新創建媒體播放器也沒有這樣做!它只是繼續播放同一首歌曲!?!?這怎麼可能呢?新想法 - 爲每首曲目創建一個不同的媒體播放器,這真的是我必須要做的嗎?也許這是Android的錯誤?

回答

0

嗯,我從來沒有得到一個非常好的答案。我認爲在模擬器中可能會發生一些有趣的事情。我所做的工作對我很好,就是將文件下載到外部SD卡並從那裏播放。這將代碼稍微改變爲:

String path = getExternalFilesDir(null).toString() + "/"; 
mMediaPlayer.setDataSource(path + mediafile); 

其餘的保持不變。

0

您聲明private String mediafile="my.mp3";然後您使用AssetFileDescriptor afd = getAssets().openFd(mediafile);,但是在任何時候(從您發佈的代碼中),您是否更改mediafile的值。
我會推薦在afd = getAssets().openFd(mediafile);之前將mediafile = theNextFile;放在線上,其中theNextFile很可能是指用戶在點擊所述按鈕之前選擇的SD卡上的文件。
我不知道如何管理從SD卡獲取文件名,但我認爲使用startActivityForResult將是一種方法。

+0

是的,你說得對,我並沒有包括這部分從我的代碼,所以我的樣品是有缺陷的。我會相應更新 - 不幸的是,這不是我的代碼無法正常工作的原因。我已用調試器驗證過,即使原始文件繼續播放,媒體文件中也有不同的文件名。在我的情況下,文件被包含在資產文件夾中,所以我可以訪問,如我的代碼所示。 –

2

我今天的資產實際上有同樣的問題,我知道這個問題。

問題是資產是作爲一大塊數據存儲的,而不是實際上作爲某個真實文件系統上的一堆單獨文件存儲的。所以,當你得到一個assetfiledescriptor時,它既指向一個文件,也有一個偏移量和一個長度。如果您僅指本身assetfiledescriptor,它總是播放資產文件夾(或其他)中的第一個媒體文件。

如果你這樣做: mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

那麼它起到正確的文件。

+0

非常有趣,當我有機會時,我會試試你的建議!我從來沒有聽說過關於資產的事情 - 你能否提供一份關於這方面的相關文檔的鏈接?謝謝! –

7

確保在更改數據源之前停止並重置mediaplayer。 更重要的事情,當你停止它調用

onCompletion

..所以做檢查你的這種方法在做什麼。然後調用

mplayer.setDataSource(audioPath); 
mplayer.setOnPreparedListener(this); 
mplayer.prepareAsync(); 
相關問題