本篇文章给大家带来了关于uniapp的相关知识,其中主要跟大家介绍uniapp怎么实现打电话录音功能,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。
最近需要实现一个通过uniapp调用手机拨打电话的功能,拨打之后同时录音,挂断电话之后将录音文件进行上传,现在将几个核心代码分享给大家,希望对大家有帮助
const recordermanager = uni.getrecordermanager();
onload(option) { let self = this; recordermanager.onstop(function (res) { console.log("res",res) self.end_time = math.round(new date().gettime() / 1000); let voicepath = res.tempfilepath; self.voicepath = voicepath; self.closetimeout(); uni.showtoast({ icon: 'loading', title: "请稍后...", duration: 0 }); uni.uploadfile({ url: self.upload_url, filepath: voicepath, name: "file", formdata: { id: self.phoneinfo.id, start_time: self.start_time, end_time: self.end_time, phone: self.phonenumber }, header: { authorization: "bearer " + uni.getstoragesync(enumdata.token) }, success: (res) => { // console.log("文件上传成功") console.log(res.data); }, fail(err) { console.log("文件上传失败") console.log(err); }, complete() { self.start_time = 0; self.end_time = 0; uni.hidetoast(); } }) }); this.getcallstatus();}
getcallstatus() { let that = this; let maintest = plus.android.runtimemainactivity(); let contexttest = plus.android.importclass("android.content.context"); let telephonymanager = plus.android.importclass("android.telephony.telephonymanager"); let telmanager = plus.android.runtimemainactivity().getsystemservice(contexttest.telephony_service); let receiver = plus.android.implements('io.dcloud.android.content.broadcastreceiver', { onreceive: function (contexttest, intent) { plus.android.importclass(intent); let phonestatus = telmanager.getcallstate(); that.callstatus = phonestatus; //电话状态 0->空闲状态 1->振铃状态 2->通话存在 switch (phonestatus) { case 0: console.log("3、电话挂断,上传录音") // 结束录音 recordermanager.stop(); break; case 1: // console.log('1、振铃状态'); break; case 2: console.log('2、通话存在') // 延迟录音 that.start_time = math.round(new date().gettime() / 1000); recordermanager.start({ duration: enumdata.audioduration, // 时长 10分钟 samplerate: enumdata.audiosamplerate, // 码率 }); break; } } }); let intentfilter = plus.android.importclass('android.content.intentfilter'); let filter = new intentfilter(); filter.addaction(telephonymanager.action_phone_state_changed); maintest.registerreceiver(receiver, filter);},
需要申请的权限,可以放到 app.vue 中
if (plus.os.name == 'android') { plus.android.requestpermissions( ['android.permission.answer_phone_calls',//手动 挂断和接听 需要这个权限 "android.permission.modify_audio_settings",//手动 挂断和接听 需要这个权限 "android.permission.call_phone",//手动 挂断和接听 需要这个权限 "android.permission.read_phone_state",//>监听电话状态 需要这个权限 "android.permission.read_call_log",//获取号码需要这个权限 "android.permission.read_audio" // 录音权限 ], function(resultobj) { var result = 0; for (var i = 0; i < resultobj.granted.length; i++) { var grantedpermission = resultobj.granted[i]; console.log('已获取的权限:' + grantedpermission); result = 1 } for (var i = 0; i < resultobj.deniedpresent.length; i++) { var deniedpresentpermission = resultobj.deniedpresent[i]; console.log('拒绝本次申请的权限:' + deniedpresentpermission); result = 0 } for (var i = 0; i < resultobj.deniedalways.length; i++) { var deniedalwayspermission = resultobj.deniedalways[i]; console.log('永久拒绝申请的权限:' + deniedalwayspermission); result = -1 } }, function(error) { console.log('申请权限错误:' + error.code + " = " + error.message); } );}
注意点
1、调试模式下可以正常监听通话挂断并且上传文件的,但是打包之后就失效?
一般的手机打包是可以正常使用的,我用的是oneplus7 ,打包后安装正常使用,部分手机需要到系统设置的权限中,将应用的【开启手机设备状态码】进行开启即可,目前遇到的就这个。
推荐学习:《uniapp视频教程》
以上就是详解uniapp实现打电话录音功能(附核心代码)的详细内容。