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);
} );
}
注意点
-
调试模式下可以正常监听通话挂断并且上传文件的,但是打包之后就失效?
一般的手机打包是可以正常使用的,我用的是 oneplus7 , 打包后安装正常使用,部分手机需要到系统设置的权限中,将应用的【开启手机设备状态码】进行开启即可,目前遇到的就这个。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanfbgbj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01