用戶
 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

掃一掃,登錄網站

小程序社區 首頁 教程 查看內容

解決微信小程序安卓機器上 backgroundAudioManager 的一個坑

Rolan 2019-12-9 10:32

一句話來說,問題的根源就在于安卓機器上 backgroundAudioManager.pause() 后還會觸發一兩次 onTimeUpdate背景在做的小程序中要做的一個功能是 AB 定次重復:重復播放音頻中 A 秒到 B 秒的聲音 N 次。根據我的需求, ...

一句話來說,問題的根源就在于

安卓機器上 backgroundAudioManager.pause() 后還會觸發一兩次 onTimeUpdate

背景

在做的小程序中要做的一個功能是 AB 定次重復:重復播放音頻中 A 秒到 B 秒的聲音 N 次。

根據我的需求,理想中流程是通過 backgroundAudioManager 的綁定事件完成功能(這里先不討論 B == backgroundAudioManager.duration 的情況)。

  1. 設定backgroundAudioManager的title和src
  2. backgroundAudioManager.seek(A)
  3. backgroundAudioManager.onSeeking()
  4. backgroundAudioManager.onSeeked()
    4.a backgroundAudioManager.play();
  5. backgroundAudioManager.onTimeUpdate
    5.a 如果 backgroundAudioManager.currentTime >= B, backgroundAudioManager.pause()
    5.a.1 如果沒達到重復次數,回到步驟2
    5.b 如果 backgroundAudioManager.currentTime < B,回到步驟5

問題

在幾次摸索后 iOS 上可以完美完成,但是安卓上會跳次數,比如希望一共播放3次,在播放完第一次之后會直接跳過第二次進行第三次的播放,最后一共只播放了兩次。

解決

我在網上搜的時候發現有人寫到了 backgroundAudioManager中的一些坑 ,其中提到

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

一開始我以為完全是這個原因,seek 后第一次 onTimeUpdate 時 currentTime >= B導致直接跳次數,所以我就加上一個 boolean 變量,在 onSeeked 中將它賦值為 true,用它判斷是否剛執行 seek,如果否再進行 currentTime 的判斷。但是改來改去問題還是存在。

在加了一堆 console.log,反復和 iOS的結果比較后為發現了問題的根本所在。

安卓機器上 backgroundAudioManager.pause() 后還會觸發一兩次 onTimeUpdate找到了問題解決起來就比較簡單啦,在 onTimeUpdate 中先判斷 backgroundAudioManager.paused 是否為 true,只有在 backgroundAudioManager.paused == false 時才進行步驟5的流程。

結論

backgroundAudioManager 和 innerAudioContext 寫起來,測試起來都好痛苦。同樣的代碼 innerAudioContext 在 2.6.1 可以在開發工具中完成我要的效果,但是后面的版本就不行了。而且 iOS,Android 還有開發者工具上的行為都不一樣,每次改一點就要用兩個手機掃碼預覽還是挺不方便的。希望官方可以優化一下。

鮮花
鮮花
雞蛋
雞蛋
分享至 : QQ空間
收藏
原作者: oliwang 來自: segmentfault.
必中分分彩在线计划 河北20选5免费预测 天津十一选五开奖结果45期开奖结果 nba开拓者vs热火 星力捕鱼靠谱平台 多多棋牌游戏 青海十一选五开奖结果 2018年七乐彩全部开奖号码 上马麻里子磁力链 下载 中昌数据股票最新消 贵阳捉鸡麻将微乐下 福建快三网上订票官网下载 双色球走势 麻仓优十七部无码链接 山东11选5历史开奖结果 韩国快乐8官网3分钟开奖 内蒙古快3遗漏数据