我試圖讓媒體播放器播放存儲在本地/外部存儲中的媒體文件。Android MediaPlayer無法播放本地存儲中的媒體文件
媒體文件使用單獨的活動下載並存儲在本地/外部存儲器中。請參閱下面的示例代碼以進行存儲。
FileOutputStream fos = openFileOutput("myfile.mp4" , Context.MODE_WORLD_WRITEABLE);
fos.write(byteArrayBuf.toByteArray());
fos.close();
對於播放相同的文件,我使用。
mMediaPlayer = new MediaPlayer();
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File(URI.create("file:///data/data/com.mypackage/files/myfile.mp4")),ParcelFileDescriptor.MODE_READ_WRITE);
mMediaPlayer.setDataSource(parcel.getFileDescriptor());
mMediaPlayer.setDisplay(mHolder);
mMediaPlayer.prepare();
mMediaPlayer.setOnPreparedListener(this);
/** On Prepared Implementation **/
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
但是,媒體播放器拒絕播放該文件並始終失敗並顯示錯誤(1,)。我真的非常想知道如何讓這個媒體播放器運行,因爲我似乎已經完成了與代碼示例內聯的所有內容,以便從本地/外部存儲中讀取文件。
注意:當我用res/raw文件夾中的文件替換本地文件時,這似乎很好。這是否與應用程序或媒體播放器無法讀取的文件有關?幫助將非常感激,使這件作品。
更新1
@克里斯: 我暫時取得的文件WORLD_WRITEABLE,一旦我得到的媒體播放器的工作實際上會寫入文件作爲WORLD_READABLE。 對路徑進行硬編碼是故意的,因爲我只是想最初確保文件的讀取沒有任何歧義。事實上,我已經通過adb shell和DDMS檢查了該文件是否存在。一旦我讀取文件,實際上我可能會使用像getFilesDir()這樣更明智的東西。 Logcat輸出如下。
surfaceCreated
I/AwesomePlayer( 34): reset
I/AwesomePlayer( 34): cancel player events
I/AwesomePlayer( 34): cancel player events
I/SampleTable( 34): There are reordered frames present.
D/MyPlayerActivity( 460): surfaceChanged
I/ActivityManager( 82): Displayed com.mypackage/.MyPlayerActivity: +1s997ms
D/MyPlayerActivity( 460): Video Prepared
D/AudioSink( 34): bufferCount (4) is too small and increased to 12
E/MediaPlayer( 460): error (1, -2147483648)
E/MediaPlayer( 460): Error (1,-2147483648)
您不應該在/ data下硬編碼路徑,而應該在運行時動態確定它。另外,你是否真的想讓其他應用可以寫入文件?發佈logcat將是一個好主意。 –