問題:點(diǎn)擊微信語音播放結(jié)束后,后臺(tái)音樂播放器不能在當(dāng)前時(shí)間基礎(chǔ)上播放,而是重新開始播放。
思考:中斷事件處理方式,一般都是中斷開始的時(shí)候暫停播放器,中斷結(jié)束的時(shí)候播放,我就是按這種方式出現(xiàn)了上述bug,不知道其他人有遇到?jīng)]。測試的過程中發(fā)現(xiàn),當(dāng)我拖動(dòng)滑塊以后,再重復(fù)上述操作(點(diǎn)擊微信語音,結(jié)束以后),發(fā)現(xiàn)音樂播放器能繼續(xù)中斷之前的播放時(shí)間播放,如果不拖動(dòng)滑塊,而是自然播放的話,就會(huì)出現(xiàn)問題描述的bug. 查閱資料網(wǎng)上沒有相關(guān)的處理,回到問題的本身,不能在中斷的時(shí)間的基礎(chǔ)上繼續(xù)播放,說明AVAudioPlayer類沒有保存當(dāng)前的播放時(shí)間,或者說中斷事件回來以后它的屬性curretTime值丟失了(原因就不得而知了),ok,那我可以在中斷開始的時(shí)候保存當(dāng)前播放的時(shí)間,等中斷結(jié)束以后再把當(dāng)前時(shí)間賦值給AVAudioPlayer的curretTime屬性,另外這里需要稍微做下處理,就是排除中斷情況,這種代碼對(duì)其它正常播放事件的影響。
解決辦法:
在封裝播放音樂的類里面創(chuàng)建兩個(gè)變量
@property (nonatomic,assign) NSTimeInterval currentPlayTime;
@property (nonatomic,assign) BOOL isPause;
在播放音樂的方法里面加入
if (![player isPlaying]) {
//解決中事件恢復(fù)后不能記錄之前的播放時(shí)間
if (self.isPause) {
player.currentTime = self.currentPlayTime;
self.isPause = NO;
}
[player play];
}
在暫停播放音樂的方法里面加入
-(void)pauseMusic:(NSString *)fileName
{
if (fileName == nil || fileName.length == 0) return;
AVAudioPlayer * player = self.musicPlayers[fileName];
if ([player isPlaying]) {
self.currentPlayTime = player.currentTime;
self.isPause = YES;
[player pause];
}
}
結(jié)果:上述思路可以解決該問題,如開發(fā)音樂播放器有出現(xiàn)上述問題的開發(fā)者可以下載具體代碼了解。github地址。