xiangyuecn / Recorder

html5 js 录音 mp3 wav ogg webm amr g711a g711u 格式,支持pc和Android、iOS部分浏览器、Hybrid App(提供Android iOS App源码)、微信,提供ASR语音识别转文字 H5版语音通话聊天示例 DTMF编码解码

Home Page:https://xiangyuecn.github.io/Recorder/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

开始录音之后会监听不到touchend事件

zhengyn0001 opened this issue · comments

我的代码的实现是按住开始录音,之后松开结束录音,可是在安卓的app里面的h5页面能监听到touchstart,不能监听到touchend

这问题就复杂了。。。

可以先把所有录音相关的代码和库全部移除试试长按后能不能收到touchend

如果能收到touchend,在加上JsBridge任意数据收发再测一遍,如果有JsBridge的话

如果能收到touchend,把录音功能一点点的加上,先加open测一遍,一直测到stop看看是哪个地方加上后有问题,然后好针对性的解决

如果用的JsBridge,并且是重写的prompt,可能是会有问题,有时间我测试一下prompt

Android App demo里面的长按录音不会触发touchend。

(测试方法错误)纯粹的H5录音就没有这个问题,IOS App的JsBridge也没有这个问题,有时间再研究研究这个bug


经过反复研究发现,是WebView中请求录音权限时,demo app每次都会调用Activity.requestPermissions方法来获得权限,而requestPermissions会造成WebView打断touch事件,进而产生H5、AppNative原生录都会产生此问题;最后把demo app内精简掉的checkSelfPermission加上检测一下是否已授权,就没有此问题了。

此bug在新的Android Demo App里面已修复。

我发现这边还是有问题啊,有时可以松开手结束,有时不行,我发现程序在不断的进行window.AppJsBridgeRequest这个方法的执行
image
image

核心的action没有打印出来。应该是recordAlive调用,native-config中录音开始后会开启一个5秒的定时器,定时发送recordAlive心跳,Native层超过时间没有收到心跳就会自动关闭录音。这就导致了AppJsBridgeRequest在不停的被调用。

你试试我的那个Android demo app是不是也会有时松开手不能停止录音,我这反复测不出来这个情况现在。

注意:H5里面touch事件除了要监听touchend,还要监听touchcancel,这两个都算手松开了

我刚试了,给其中的录制按钮加上touchstart,touchend时间,按就了就会出现那个长按复制的字,然后松开手录音没有结束,以及我这边的项目的touchcancal执行的时间好像不太对,感觉是刚开始就执行了touchcancel,松开手还是没有监听到touchend的打印

image

看你截图那是一调用请求权限就立马执行了touchcancel,Android里面打个断点看看是不是走了Activity.requestPermissions方法,只要走了这个方法就会导致touchcancel。 我后面是把checkSelfPermission加了回去,只要有权限了就不走Activity.requestPermissions,就没有touchcancel了。

另外长按出现复制这个可以参考我的代码,注意首尾这两行:

$("body").css("user-select","none");//kill all 免得渣渣浏览器里面复制搜索各种弹,这些浏览器单独给div设置是没有用的
rtcVoiceDownHit=setTimeout(function(){
rtcVoiceStart=true;
//开始录音
recstart(function(err){
if(err){
rtcVoiceStart=false;
rtcMsgView("[错误]"+err,false);
return;
};
if(rtcVoiceStart){//也许已经up了
elem.css("background","#f60").text("松开结束录音");
};
});
},300);
}).bind("mouseup touchend touchcancel",function(e){
if(rtcVoiceDownHit || rtcVoiceStart){
$("body").css("user-select","");

image
狂点录音按钮, 录音报错, 会触发destroy函数, 但是其他线程引用了main.Log 打日志, 但是main已经是 null
image
image

我研究研究,估计ios也会有这个问题😂

Android里面 构造函数 和 destroy 加了一个synchronized就没有多大问题了,其他线程同步一下就没有这个狂点导致崩溃的了