- innerAudioContext 真机无法正常播放?
1、模拟器内所有都正常 [图片] 2、真机播放几乎秒结束 [图片] // 创建音频实列 createInnerAudioContext() { // 获取innerAudioContext实例 innerAudioContext = wx.createInnerAudioContext(); // 是否遵循系统静音开关,默认为 true。当此参数为 false 时,即使用户打开了静音开关,也能继续发出声音。从 2.3.0 版本开始此参数不生效 innerAudioContext.obeyMuteSwitch = false; this.loadAudio(); innerAudioContext.onPlay(() => { console.log('开始播放'); this.getAudioDuration(); this.setData({audioPlayStatus: 'start'}); }); // 监听音频自然播放至结束的事件 innerAudioContext.onEnded(() => { console.log('自然播放至结束'); this.setData({audioPlayStatus: 'stop', showCurrentTime: '00:00'}); }) // 监听音频停止事件 innerAudioContext.onStop(() => { console.log('停止播放'); this.setData({audioPlayStatus: 'stop', showCurrentTime: '00:00'}); }) // 监听音频播放错误事件 innerAudioContext.onError((err) => { console.log('播放错误', err); this.setData({audioPlayStatus: 'stop', showCurrentTime: '00:00'}); console.log('err', err); wx.showToast({ title: `音频播放失败了!${err.errMsg.split(' ')[1]}`, icon: 'none' }) }) }, // 开始/停止播放音频 startOrStopPlayAudio () { const {audioPlayStatus} = this.data; if(audioPlayStatus === 'stop') { this.loadAudio(); setTimeout(() => { innerAudioContext.play() }, 1000) } else { innerAudioContext.stop(); } }, // 加载音频 loadAudio() { if(!innerAudioContext || !this.data.recorderFilePath) return; innerAudioContext.src = this.data.recorderFilePath; }, // 获取音频时长以及播放进度 getAudioDuration() { setTimeout(() => { innerAudioContext.duration; innerAudioContext.onTimeUpdate(() => { console.log(innerAudioContext.duration); console.log(innerAudioContext.currentTime); const audioDuration = Math.floor(innerAudioContext.duration); // 总时长(有延迟) const showCurrentTime = Math.floor(innerAudioContext.currentTime); // 当前播放进度 this.setData({ showCurrentTime: this.getMinuteBySecond(showCurrentTime) }) if (audioDuration !== 0 && audioDuration !== Infinity && !isNaN(audioDuration)) { this.setData({ showTotalTime: this.getMinuteBySecond(audioDuration) }) } }) }, 500) },
05-13 - ios端,录音管理器调用resume意外地触发了onStart回调?
# 埋点发现在ios端,调用RecorderManager.resume(),正常触发onResume回调之后又触发了一次onStart回调,这个问题无法稳定复现,故不能提供可复现的代码片段。翻了社区发现有3个帖子在问了,截止目前社区没有修复的反馈。 # 相关帖子 继续录音RecorderManager.resume(),ios会进录音开始监听,安卓不会?录音情况?录音resume触发onStart回调# 问题 这个问题会不会导致录音文件的时长小于onStop回调的时长res.duration?我是在排查【这个问题】时,发现的意外触发onStart回调的问题
2023-11-06 - 小程序录音实时波形图实现
[图片] 实现思路:主要使用canvas绘制柱状图,音量大小由微信recorderManager.onFrameRecorded回调的数据通过快速傅里叶转换算法实现转换 <view style="display: flex; position: relative; justify-content: center; width: 100%; background-color: black;"> <canvas id="myCanvas" type="2d" catch:touchstart="onTouchStart" catch:touchmove="onTouchMove" catch:touchend="onTouchEnd" style="width: 100%;height: 220px;"></canvas> <view style="position: absolute; width: 0.5px; height: 220px; background-color: blue;" /> </view>
2023-04-26 - wechatpay-php 报错Cannot load privateKey from
wechatpay-php 报错 Rsa::from 报错 Cannot load privateKey from(string), please take care about the \$thing input /** * 构建一个客户端实例 * wechatpay-php */ public static function instanceWeChatPay() { // 商户号 $merchantId = WeChat::$merchantId; // 从本地文件中加载商户API私钥,商户API私钥会用来生成请求的签名 //dd(WeChat::$merchantPrivateKeyFilePath); 路径 //"D:\web\3boat\storage\cert\wechat\4C1BBE189365B735FF1B7AE9A63EDCB7CDA49093\apiclient_key.pem" $merchantPrivateKeyInstance = Rsa::from(WeChat::$merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE); dd($merchantPrivateKeyInstance); // 商户API证书序列号 $merchantCertificateSerial = WeChat::$merchantCertificateSerial; // 从本地文件中加载微信支付平台证书,用来验证微信支付应答的签名 $platformPublicKeyInstance = Rsa::from(WeChat::$platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC); // 获取微信支付平台证书序列号 $platformCertificateSerial = PemUtil::parseCertificateSerialNo(WeChat::$platformCertificateFilePath); // 构造一个 APIv3 客户端实例 WeChat::$instance = Builder::factory([ 'mchid' => $merchantId, 'serial' => $merchantCertificateSerial, 'privateKey' => $merchantPrivateKeyInstance, 'certs' => [ $platformCertificateSerial => $platformPublicKeyInstance, ], ]); }
2021-12-27 - 小程序右上角的胶囊按钮能不能去掉或者隐藏?
小程序右上角的胶囊按钮能不能去掉或者隐藏[图片]
2019-09-18 - 使用input组件的adjust-position(键盘弹起时,是否自动上推页面)出现问题如何解决?
在聊天室的场景的下和用户进行聊天, 有以下的场景: adjust-position 的属性为true 1、在聊天历史列表比较长,点击底部fixed 定位的输入框弹起手机键盘的时候,输入框上面的内容会自动向上推(涂黑部分是订单的卡片,也是聊天的历史)这个体验是可以接受的。 图一: [图片] 2、在聊天历史列表比较短的时候,点击键盘也会把内容会自动向上推 ,效果如下: 点击输入框之前: [图片] 点击输入框之后: [图片] 想到的解决方案: 能不能使用input组件的bindkeyboardheightchange(监听键盘高度变化)或者 bindfocus(聚焦)+bindblur(失去焦点) 获取键盘的高度来动态改变 adjust-position 属性的值来解决问题 过程: 这里 adjust-position 默认值分别设置两种情况: 一、.adjust-position: true 键盘弹起时,自动上推页面 1. 浏览历史长的时候不做处理,键盘唤起的时候,页面应该自动上推,体验正常 2.浏览历史比较短的时候,唤起键盘的时候, 这个需要计算浏览历史列表的安全距离 根据这个安全距离才能设置adjust-position 的开启,浏览历史的长度会有一个临界值 判断这个临界值,如果浏览历史的长度,小于临界值,则设置 adjust-position: false,唤起键盘不会向上推动页面 先测试只有一个聊天内容时候,第一次唤起键盘是如下的效果: [图片] 为什么还是会把页面的聊天内容挤上去,由于唤起键盘的时候,adjust-position 还是true 唤起键盘之后才能拿到键盘的高度,才能判断是否设置adjust-position为false. 点击第二次就正常了,由于点击第一次已经将adjust-position 设置为false,如图: [图片] 二、.adjust-position: false 键盘弹起时,不自动上推页面 1、聊天历史列表数据短的时候,就不测试了,效果和上图一样是正常的, 2、在聊天历史列表长的时候,在点击唤起键盘的时候,效果如下: [图片] 由于默认是 不自动上推页面 ,弹起键盘获取键盘高度的时候,adjust-position的值还是false 再点击第二次唤起键盘的时候,才能显示正常,如上面图一的截图。 造成这样原因归根到底是 在唤起键盘的时候,adjust-position的属性改变的操作是在 拿到键盘高度之后,键盘高度拿到之前界面就已经 被自动上推或者没有被推上去 第二次唤起键盘才能正常显示,不知道这种场景下如何解决,比如提早获取键盘的高度 计算出安全的聊天历史长度。希望各位大佬指导下。
2020-12-14 - 微信小程序底部textarea输入框,如何解决键盘弹起时页面整体上移问题?
微信小程序底部textarea输入框,如何解决键盘弹起时页面整体上移问题
2023-08-09