UPDATE: 这篇博文已经过期, 新的BUG总结请看微信JSSDK与录音相关的坑

微信JSSDK有不少坑, 最近做一个webapp, 用到了其中的录音功能, 发现不少问题, 总结一下:


当你调用startRecord和stopRecord的时间间隔过于短时, stopRecord调用会失败, 但是不会触发success, fail或complete中的任何一个Handler, 导致UI卡住.

我的解决方法是: startRecord调用成功后500ms才可以调用stopRecord, 如果在500ms之内就执行了endRecord, 则判定为过早的endRecord, 执行failHandler, 随后每隔300ms调用一次endRecord, 直至endRecord调用成功.

function delayedStopRecord(options) {
stopRecord(options);
setTimeout(function () {
if (!self.canStartRecord) {
delayedStopRecord(options);
}
}, 300);
} self.startRecord = function (options) {
if (!self.canStartRecord) return;
options.success = options.success || $.noop;
options.fail = options.fail || $.noop;
options.complete = options.complete || $.noop;
self.canStartRecord = false;
self.canStopRecord = false;
var s1 = options.success;
options.success = function () {
s1();
setTimeout(function () {
self.canStopRecord = true;
}, 500);
}
var fail = options.fail;
options.fail = function (res) {
fail();
self.canStartRecord = true;
}
var s2 = options.success;
options.success = function () {
s2();
wx.onVoiceRecordEnd({
complete: options.onRecordTimeout
});
}
wx.startRecord(options);
} self.endRecord = function (options) {
options.success = options.success || $.noop;
options.fail = options.fail || $.noop;
options.complete = options.complete || $.noop;
var complete = options.complete;
options.complete = function () {
complete();
self.canStartRecord = true;
}
if (!self.canStopRecord) {
// Fix for too short stop record call failure.
// Can only stop record after 500 ms. Before 500ms, it's a premature endRecord call.
// For a premature endRecord call, try stop record every 300ms.
options.fail({ errMsg: 'stopRecord:tooshort' }); // Manually call failHandler.
options.abort = true;
delayedStopRecord(options);
} else {
stopRecord(options);
}
} function init() {
// Initialize flags.
self.canStartRecord = true; // True if this is the first call or the last stopRecord succeeded.
self.canStopRecord = false;
}

其中stopRecord函数封装了wx.stopRecord和wx.uploadVoice, init是viewModel的初始化函数.


的确感受到了写作的好处, 在这里这段代码的过程中我还调整了代码的位置让代码的逻辑更加清晰了. 继续加油!


其他发现的一些bug, 暂时还没解决.

iPhone:

录音中按home返回主菜单, 录音中断, 回到微信, 此时endRecord会失败因为并没有在录音, 需要调用startRecord.

Android:

录音中按home返回主菜单, 录音继续, 回到微信可以正常endRecord

iPhone:

录音中关闭webapp, 录音结束, 回到webapp可以正常启动录音.

Android:

录音中关闭webapp, 录音继续, 回到webapp调用startRecord会失败提示recording.

iPhone:

录音中刷新webapp, 无法调用startRecord.

Android:

没有刷新按钮所以没这个问题.

微信JSSDK录音的一些bug的更多相关文章

  1. HTML5微信jssdk录音播放语音的方法

    HTML5微信jssdk录音播放语音的方法需要注意的2个问题1 就是一定要判断1秒内 录音都不算 ps:太短不能录音 2 录音超过1分钟 会发现正在录音突然消失 所以要写wx.onVoiceRecor ...

  2. 微信JSSDK与录音相关的坑

    欢迎各位转载, 以让微信团队重视这些恼人的BUG. 请注明出处微信JSSDK与录音相关的坑 by lzl124631x 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷 ...

  3. 微信JSSDK与录音相关的坑

    微信JSSDK与录音相关的坑 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷不丁地被坑一道, 让我时常想嘶吼: "微信JSSDK就是个大腊鸡!!!!!!!! ...

  4. 【微信JSSDK】PHP版微信录音文件下载

    微信的录音文件上传到微信服务器上,只能保存三天. 因此需要做一个转存到自己服务器,或者七牛云的操作. 转存到自己服务器 调用微信JSSDK API 录音, 录音结束,上传到微信服务器,获取录音文件的 ...

  5. 从零开始实现基于微信JS-SDK的录音与语音评价功能

    最近接受了一个新的需求,希望制作一个基于微信的英语语音评价页面.即点击录音按钮,用户录音说出预设的英文,根据用户的发音给出对应的评价.以下是简单的Demo: ![](reecode/qrcode.pn ...

  6. 【转】微信jssdk录音功能开发记录

    转自:http://www.cnblogs.com/liujunyang/p/4962423.html#undefined 0.需求描述 在微信浏览器内打开的页面,制作一个按钮,用户按住按钮后开始录音 ...

  7. 前端工程师如何快速的开发一个微信JSSDK应用

    亲们,订阅号出来已经很久了,作为一个前端工程师或者全栈工程师,你是不是错过了什么?大概许多攻城狮同砚还没有反应过来订阅号怎么回事,就马上要被微信的应用号秀一脸了.在应用号还没有正式出来之前,我们赶紧一 ...

  8. 微信公众平台开发 微信JSSDK开发

    根据微信开发文档步骤如下: 1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. JS接口安全域名设置 mi.com(前面不用带www/http,域名必须备案过) 2.引 ...

  9. 微信JS-SDK

    <div class="lbox_close wxapi_form"> <h3 id="menu-basic">基础接口</h3& ...

随机推荐

  1. Bootstrap--组件之按钮组

    什么是按钮组呢?简单解释:就是把一堆的按钮放在一行或者一列中.下面来看一个实例. 按钮组嘛,首先是按钮,所以会用到.btn这个类,还有就是bootstrap提供的按钮组.btn-group这个类,所以 ...

  2. w3c 学习html DOM

    什么是DOM? DOM是W3C标准,定义了访问HTML 和 XML文档的标准 W3C 文档对象模型(DOM)是中立于平台和语言接口,它允许程序动态的访问和更新文档的内容.结构和样式. W3C DOM ...

  3. iOS开发——真机调试证书—发布证书

    (最近准备考试,空闲整理成博客……)

  4. 鼠标操作[OpenCV 笔记10]

    ) winname 窗口名字 onMouse 指定窗口每次鼠标事件发生的时候,被调用的函数指针.函数的原型应为void Foo(int event, int x, int y, int flags, ...

  5. jQuery查看dom元素上绑定的事件列表

        jQuery API提供了一种能够查看元素已绑定事件的列表,这个功能在进行功能调试的时候特别有用,尤其确定在代码执行过程中元素绑定的事件是否被更改. 1: jQuery( elem ).dat ...

  6. SQLServer:定时作业

    SQLServer:定时作业: 如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代理-作业来实现 也快可以定时备 ...

  7. [转] HTML5终极备忘大全(图片版+文字版)---张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1544 一.前言兼图片 ...

  8. CSS三角形广告文字

    街上经常碰到一些发各类广告传单的,有一次收到一张房地产广告的传单,顺手留下来,看着里面有些广告挺吸引人,同时也想练练自己css技术,故抽空做了一下. 原图某区域如下: 实现上图效果是需要一些想象力的, ...

  9. PHP 返回近7天 本月 上月日期

    <?php /** * 返回近7天,本月,上月数据 * 不计当天(展示后台数据专用) */ function weekMonthLastMonth($search_date = 'week') ...

  10. Windows BAT字符串操作

    ::操作系统:windows xp sp3 @echo off ::初始化变量set str1=This is string1set str2=This is string2set str3=This ...