在閱讀「Media Playback」和「MediaPlayer」android文檔後,我仍然感到困惑,需要關於setDataSource重載方法的有經驗的建議。MediaPlayer setDataSource需要最佳實踐建議
我正在使用MediaPlayer
在我的項目中的Service
組件中,播放音樂時將會是foregroundService。我的我的音樂文件(.mp3)在我的apk的res/raw
文件夾中。 要開始播放,我知道我必須準備MediaPlayer對象。由於默認情況下android應用程序中的服務使用單個進程和主線程,因此我不希望我的用戶在MediaPlayer準備好自己的時候獲得ANR (假設原始文件夾中的媒體文件具有較大的大小)。 然後我用prepareAsync
代替prepare
(同步)。所以我不能使用:
mp = MediaPlayer.create(context, R.raw.myfile);
因爲這已經呼籲prepare()
內部而不是prepareAsync()
。 所以基本上我有兩個選擇(二從四個):
mp.prepareAsync();
最後我的問題出現了:
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
或
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
使用其中的一個,我可以簡單的使用後「包括這些不同的方法,哪一個是最好的選擇?是否有任何好處,我錯過了什麼?」
個人而言,我喜歡最後一種方法,因爲它不在代碼中使用字符串。儘管如此,如果這不算「利益」的話。 – Geobits
@Geobits,避免代碼中的常量字符串是一個很好的做法,但我知道,但'FileDescriptor'是android喜歡的本地文件。感謝您的評論。我建議你閱讀我對接受答案的評論。 –