詳解小程序BackgroundAudioManager踩坑之旅

發布時間:2019-12-08 16:16 來源:互聯網 當前欄目:網站服務器

由于貴公司業務發展需要,切圖仔開始寫起了小程序啦(興奮地搓小手手)

貴公司是知識付費平臺,需要音頻播放課程,同時希望用戶在退出小程序后依然可以聽課。在這種情況下,小程序的API——BackgroundAudioManager就派得上用場啦。

在看完官方文檔,信心滿滿地寫完提測后,測試小姐姐找出的bug比我的工資還多!!(😭😭😭)因此有了本篇文章。

本篇涉及到的幾個坑(以下BAM為BackgroundAudioManager的縮寫)

一個誤區 BAM.onStop() 與 BAM.onEnded() 的坑 BAM.seek() 與 BAM.onSeeked() 的坑 BAM.onTimeUpdate() 的坑 在音頻頁退出小程序暫停音頻后返回小程序的坑

一個誤區

BAM.onCanplay()是監聽背景音頻進入可播放狀態事件,并不代表在該事件中,音頻就為播放狀態。

BAM.onStop() 與 BAM.onEnded() 的坑

在BAM.onStop() 與 BAM.onEnded()的回調事件中,audio.src為空

BAM.onStop(): 當再次播放音頻時,將data數據中音頻的src賦值給BAM,然后在onTimeUpdate()事件內跳轉到上次暫停的時間點(記得本地緩存音頻播放時間哦~)

BAM.onEnded():在BAM.onEnded()回調函數中,將data數據中音頻的src賦值給BAM,然后在onTimeUpdate()事件內暫停音頻

BAM.seek() 與 BAM.onSeeked() 的坑

設置src后立即seek()失效

seek操作最好放在BAM.onTimeUpdate事件中。 類似HTML的Audio元素的ontimeupdate方法,建議將currentTime的改變都在該方法中進行。

暫停狀態下跳轉到指定位置,在onSeeked()回調中,Android的currentTime是跳轉前的時間,而IOS是跳轉后的時間

雖然在onSeeked()回調函數中,Android獲取currentTime為跳轉前的時間,但若開始播放,還是從指定位置開始播放。所以若有暫停連續跳轉并需要獲取currentTime的需求,可在onSeeked()回調函數中判斷若為Android并且為暫停狀態時播放。

開發者工具不走onSeeked()回調

如果在onSeeked()回調里面有特殊操作,記得區分是否是開發者工具~

BAM.onTimeUpdate() 的坑

在退出小程序后,Android與IOS均不走onTimeUpdate()事件

因此若在onTimeUpdate()事件內實時緩存音頻的播放時長會導致在退出小程序暫停后返回拿到的音頻緩存時間是退出前的時間。可以在onPause()與onEnded()事件中記錄暫停時的音頻播放時長。(在onTimeUpdate()事件內所做的操作可根據實際情況考慮節流哦~)

在音頻頁退出小程序暫停音頻后返回小程序的坑

IOS:BAM.src為空

Android:BAM.src不為空,但play()失敗

這點與第二點的處理方式相同。當在音頻頁退出小程序暫停音頻后返回,進入onShow()事件時,將data數據中音頻的src賦值給BAM,然后在onTimeUpdate()事件內跳轉到上次暫停的時間點

原本以為可以寫的會有很多,最后寫下來也就幾個點,表達的不也是很清晰,就當學習日記吧

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持IIS7站長之家。

  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、