蔡华林
蔡华林
  • 发布:2018-06-29 15:25
  • 更新:2021-01-04 11:40
  • 阅读:2251

【报Bug】HBuilder 9.0.8.201806081953 录音功能闪退

分类:HBuilder

详细问题描述
[内容]
HBuilder 升级至9.0.8.201806081953版本,真机运行项目录音功能闪退,后真机运行系统自带H5+项目,进入录音功能,APP闪退,网上下的的H5+ APP没有问题

刚才试了下HBuilder X,也是一样的情况。
重现步骤
[步骤]
HBuilder 升级至9.0.8.201806081953版本,真机运行H5+项目,进入录音功能
[结果]
APP闪退
[期望]

运行环境
华为PAD JDN-AL00
[系统版本]
[浏览器版本]
[IDE版本]
[mui版本]
3.7
附件
[代码片段]
[安装包]

联系方式
[QQ]
[电话]

2018-06-29 15:25 负责人:无 分享
已邀请:
Neil_HL

Neil_HL

  • wobulangg

    有用,谢谢~

    2018-09-17 19:41

Neil_HL

Neil_HL

如何调用api的?最好上传一个能重现问题的demo

蔡华林

蔡华林 (作者)

function startRecord() {
r = plus.audio.getRecorder();
if(r == null) {
return;
}
console.log("1111");
r.record({
filename: '_doc/audio/'
}, function(p) {
console.log("2222");
if(auTime) {
clearTimeout(auTime);
}
plus.io.resolveLocalFileSystemURL(p, function(entry) {
createItem(entry, false);
files.push({
name: "audio0",
path: '_doc/audio/' + entry.name,
id: "audio-0"
});
console.log("3333");
}, function(e) {
console.log("file access error");

                });  
            }, function(e) {  
                console.log("----error-----");  
            });  
            er.style.display = 'block';  
            //最多录1分钟  
            console.log("44444");  
            auTime = setTimeout(function() {  
                stopRecord();  
                console.log("5555");  
            }, 60000);  
            t = 0;  
            ri = setInterval(function() {  
                t++;  
                rt.innerText = timeToStr(t);  
            }, 1000);  
        }  

DEBUG打印的结果为
[手机运行] 1111
[手机运行] 44444

蔡华林

蔡华林 (作者)

直接用HBuilder创建一个h5+项目,里面自带各种功能的例子,运行录音功能,PAD就会闪退。
我这里用的是华为PAD JDN-AL00,不知道别的机子会不会有这个问题

蔡华林

蔡华林 (作者)

还真是format:'amr'这个的参数问题,加上这个就可以了。

1***@qq.com

1***@qq.com

加了format:'amr'这个参数,oppo的手机还是会闪退。其他安卓手机会出现录音文件播放不了

  • Neil_HL

    试试HBuilderX,看看有问题没

    2019-04-17 09:22

  • 1***@qq.com

    回复 Neil_HL:安卓录音下来的文件转成base64,只有这么短data:audio/amr;base64,IyFBTVIK。是为什么呢?

    2019-04-18 09:57

  • 1***@qq.com

    回复 Neil_HL:<!DOCTYPE html>

    <html>

    <head>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />

    <title></title>

    <link href="css/mui.min.css" rel="stylesheet"/>

    <link rel="stylesheet" type="text/css" href="css/audio.css"/>

    <style type="text/css">

    body,html{

    height: 100%;

    }

    .fiexed-buttom{

    position: fixed;

    bottom: 30px;

    left: 15px;

    right: 15px;

    }

    </style>

    </head>

    <body>

    <header class="mui-bar mui-bar-nav">

    <h1 class="mui-title">录音</h1>

    </header>

    <div class="mui-content">

    <div class="fiexed-buttom">

    <button id="recorder" type="button" class="mui-btn mui-btn-blue mui-btn-block">录制语音文件转base64字符串</button>

    <button id="player" type="button" class="mui-btn mui-btn-blue mui-btn-block">base64字符串转成语音文件播放</button>

    </div>

    </div>


    <div id='sound-alert' class="rprogress">  
    <div class="rschedule"></div>
    <div class="r-sigh">!</div>
    <div id="audio-tips" class="rsalert">手指上滑,取消发送</div>
    </div>

    <script src="js/mui.min.js"></script>
    <script type="text/javascript" charset="utf-8">
    console.log(document.body.clientHeight)
    mui.init({
    gestureConfig: {
    tap: true, //默认为true
    drag: true, //默认为true
    hold: true, //默认为false,不监听
    release: true //默认为false,不监听
    }
    });

    var MIN_SOUND_TIME = 800;
    var recorder = null;
    var startTimestamp = null;
    var stopTimestamp = null;
    var stopTimer = null;
    var recordCancel = false;

    var soundAlert = document.getElementById("sound-alert");
    var audioTips = document.getElementById("audio-tips");
    // 控制录音弹出框是否播放
    var setSoundAlertVisable=function(show){
    if(show){
    soundAlert.style.display = 'block';
    soundAlert.style.opacity = 1;
    }else{
    soundAlert.style.opacity = 0;
    // 完成再真正隐藏
    setTimeout(function(){
    soundAlert.style.display = 'none';
    },200);
    }
    };

    mui.plusReady(function () {
    /**
    * 录制语音文件转base64字符串
    */
    // 按住录音(长按开始录音)
    document.querySelector('#recorder').addEventListener('hold',function () {
    recordCancel = false;
    if(stopTimer)clearTimeout(stopTimer);

    audioTips.innerHTML = "手指上划,取消发送";
    soundAlert.classList.remove('rprogress-sigh');
    setSoundAlertVisable(true);

    // 获取当前设备的录音对象
    recorder = plus.audio.getRecorder();
    startTimestamp = (new Date()).getTime();

    console.log("supportedFormats:"+JSON.stringify(recorder.supportedFormats));
    recorder.record({
    format: "amr",
    filename: "_doc/audio/"
    }, function (path) {
    if (recordCancel) return;
    console.log("path:"+path);
    Audio2dataURL(path);
    }, function ( e ) {
    mui.toast("录音出现异常: " + e.message );
    });
    })

    // 释放保存(松手保存)
    document.querySelector('#recorder').addEventListener('release',function () {
    if (audioTips.classList.contains("cancel")) {
    audioTips.classList.remove("cancel");
    audioTips.innerHTML = "手指上划,取消发送";
    }
    // 判断录音时间
    stopTimestamp = (new Date()).getTime();
    if (stopTimestamp - startTimestamp < 800) {
    audioTips.innerHTML = "录音时间太短";
    soundAlert.classList.add('rprogress-sigh');
    recordCancel = true;
    stopTimer=setTimeout(function(){
    setSoundAlertVisable(false);
    },800);
    }else{
    setSoundAlertVisable(false);
    }
    recorder.stop();
    })

    // 拖动屏幕(手指上划,取消发送)
    document.body.addEventListener('drag', function(event) {
    if (Math.abs(event.detail.deltaY) > 50) {
    if (!recordCancel) {
    recordCancel = true;
    if (!audioTips.classList.contains("cancel")) {
    audioTips.classList.add("cancel");
    }
    audioTips.innerHTML = "松开手指,取消发送";
    }
    } else {
    if (recordCancel) {
    recordCancel = false;
    if (audioTips.classList.contains("cancel")) {
    audioTips.classList.remove("cancel");
    }
    audioTips.innerHTML = "手指上划,取消发送";
    }
    }
    }, false);

    /**
    * base64字符串转成语音文件播放
    */
    document.querySelector('#player').addEventListener('tap',function () {
    // 语音文件dataURI
    var base64Str = 'data:audio/amr;base64,IyFBTVIK'
    // 转成.amr文件播放
    dataURL2Audio(base64Str, function(entry){
    var toURL = entry.toURL();
    // toURL = '_doc/audio/1554802185877.amr'
    console.log(toURL)
    // 播放音频
    playAudio(toURL);
    })

    // playAudio('https://qht-dev.oss-cn-hangzhou.aliyuncs.com/imSound/190326161219440008.amr')

    })

    })


        /**  
    * 播放音频
    * @param {Object} path
    */
    function playAudio (path) {
    var player = plus.audio.createPlayer(path);
    player.play(function(){
    mui.toast("播放成功");
    }, function(e) {
    mui.toast("播放失败");
    });
    }

    /**
    * 录音语音文件转base64字符串
    * @param {Object} path
    */
    function Audio2dataURL (path) {
    plus.io.resolveLocalFileSystemURL(path, function(entry){
    entry.file(function(file){
    var reader = new plus.io.FileReader();
    reader.onloadend = function (e) {
    console.log(e.target.result);
    };
    reader.readAsDataURL(file);
    },function(e){
    mui.toast("读写出现异常: " + e.message );
    })
    })
    }

    /**
    * base64字符串转成语音文件(参考http://ask.dcloud.net.cn/question/16935)
    * @param {Object} base64Str
    * @param {Object} callback
    */
    function dataURL2Audio (base64Str, callback) {
    var base64Str = base64Str.replace('data:audio/amr;base64,','');
    var audioName = (new Date()).valueOf() + '.amr';

    plus.io.requestFileSystem(plus.io.PRIVATE_DOC,function(fs){
    fs.root.getFile(audioName,{create:true},function(entry){
    // 获得平台绝对路径
    var fullPath = entry.fullPath;
    if(mui.os.android){
    // 读取音频
    var Base64 = plus.android.importClass("android.util.Base64");
    var FileOutputStream = plus.android.importClass("java.io.FileOutputStream");
    try{
    var out = new FileOutputStream(fullPath);
    var bytes = Base64.decode(base64Str, Base64.DEFAULT);
    out.write(bytes);
    out.close();
    // 回调
    callback && callback(entry);
    }catch(e){
    console.log(e.message);
    }
    }else if(mui.os.ios){
    var NSData = plus.ios.importClass('NSData');
    var nsData = new NSData();
    nsData = nsData.initWithBase64EncodedStringoptions(base64Str,0);
    if (nsData) {
    nsData.plusCallMethod({writeToFile: fullPath,atomically:true});
    plus.ios.deleteObject(nsData);
    }
    // 回调
    callback && callback(entry);
    }
    })
    })
    }
    </script>

    </body>

    </html>

    2019-04-18 10:28

  • 1***@qq.com

    @DCloud_UNI_Neil上面是demo

    2019-04-18 10:28

DCloud_UNI_Anne

DCloud_UNI_Anne

科学要的是数据,不是情绪。请大家把机型设备信息,描述越清楚越好,我们好排查。

该问题目前已经被锁定, 无法添加新回复