相信大家在開發(fā)過程中,可能會有這些場景昙啄,點贊需要音效猎提,彈窗需要音效获三,那么怎么實現(xiàn)呢?可以通過MediaPlayer或SoundPool來實現(xiàn)锨苏。
-
MediaPlayer
-
SoundPool
- MediaPlayer
1)獲取實例
MediaPlayer mp = new Mediaplayer();
mp.setDataSource(R.raw.test);
或者
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
2)播放來源
1.自帶resource資源
MediaPlayer.create(this, R.raw.test);
2.SD卡或其他文件路徑下的媒體文件
mp.setDataSource("/sdcard/test.mp3");
3.網(wǎng)絡(luò)媒體文件
mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
MediaPlayer的setDataSource一共四個方法:
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)
其中使用FileDescriptor時疙教,需要將文件放到與res文件夾平級的assets文件夾里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
來設(shè)置datasource
3)播放器控制方法
Android通過控制播放器狀態(tài)的方式來控制媒體文件的播放
prepare()和prepareAsync()提供同步和異步設(shè)置播放器進入prepare狀態(tài)蚓炬,需要注意的是松逊,如果MediaPlayer實例是由create方法創(chuàng)建的,那么第一次啟動播放前不需要再調(diào)用prepare()了肯夏,因為create方法里已經(jīng)調(diào)用過了经宏。
start()是真正啟動文件播放的方法
pause()和stop()比較簡單,起到暫停和停止播放的作用
**seekTop()可以讓播放器從指定的位置開始播放驯击,是個異步方法烁兰,真正定位完成會觸發(fā)OnSeekComplete.onSeekComplete()
release()可以釋放播放器占用的資源
reset()可以使播放器從Error狀態(tài)中恢復(fù)過來,重新回到Idle狀態(tài)
4)設(shè)置播放器的監(jiān)聽器
MediaPlayer提供了一些設(shè)置不同監(jiān)聽器的方法來更好地對播放器的工作狀態(tài)進行監(jiān)聽徊都,以期及時處理各種情況沪斟,如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、setOnErrorListener(MediaPlayer.OnErrorListener listener)等,設(shè)置播放器時需要考慮到播放器可能出現(xiàn)的情況設(shè)置好監(jiān)聽和處理邏輯,以保持播放器的健壯性主之。
- SoundPool
可以用SoundPool播放一些短的反應(yīng)速度要求高的聲音择吊。MediaPlayer適合播放長的音頻。
注意:1.SoundPool載入音樂使用獨立線程槽奕,不會阻塞UI主線程操作几睛。但是這里如果音效文件過大沒有載入完成,我們調(diào)用play方法時可能產(chǎn)生嚴重的后果粤攒,這里Android SDK提供了一個SoundPool.OnLoadCompleteListener類來幫助我們了解媒體文件是否載入完成所森,我們重載 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可獲得。
2.SoundPool在load時可以處理多個媒體一次初始化并放入內(nèi)存中夯接,這里效率比MediaPlayer高了很多焕济。 3. SoundPool類支持同時播放多個音效,這對于游戲來說是十分必要的盔几,而MediaPlayer類是同步執(zhí)行的只能一個文件一個文件的播放晴弃。
使用方法
1.創(chuàng)建SoundPool實例
public SoundPool(int maxStream, int streamType, int srcQuality)
maxStream —— 同時播放的流的最大數(shù)量
streamType —— 流的類型,一般為STREAM_MUSIC(具體在AudioManager類中列出) srcQuality —— 采樣率轉(zhuǎn)化質(zhì)量问欠,當前無效果肝匆,使用0作為默認值
eg. SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); 創(chuàng)建了一個最多支持3個流同時播放的,類型標記為音樂的SoundPool顺献。
2 一般把多個聲音放到HashMap中去
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong, 1));
soundpool的加載:
//從APK資源載入
int load(Context context, int resId, int priority)
//從FileDescriptor對象載入
int load(FileDescriptor fd, long offset, long length, int priority)
//從Asset對象載入
int load(AssetFileDescriptor afd, int priority)
//從完整文件路徑名載入 最后一個參數(shù)為優(yōu)先級
int load(String path, int priority)
播放
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) leftVolume和rightVolume表示左右音量
priority表示優(yōu)先級
loop表示循環(huán)次數(shù)
rate表示速率,如 //速率最低0.5最高為2枯怖,1代表正常速度
sp.play(soundId, 1, 1, 0, 0, 1);
而停止則可以使用 pause(int streamID) 方法注整,這里的streamID和soundID均在構(gòu)造SoundPool類的第一個參數(shù)中指明了總數(shù)量,而id從0開始度硝。