实例详解uniapp如何实现电话录音功能(附代码)

 7580

本篇文章给大家带来了关于uniapp的相关知识,其中主要介绍了怎么用uniapp实现拨打电话并且还能同步录音的功能,感兴趣的朋友一起来看一下吧,希望对大家有帮助。


实例详解uniapp如何实现电话录音功能(附代码)


uniapp 实现打电话录音功能

最近需要实现一个通过 uniapp 调用手机拨打电话的功能,拨打之后同时录音,挂断电话之后将录音文件进行上传,现在将几个核心代码分享给大家!

  1. const recorderManager = uni.getRecorderManager();
  2. onLoad(option) {
  3.             let self = this;
  4.             recorderManager.onStop(function (res) {
  5.                 console.log("res",res)
  6.                 self.end_time = Math.round(new Date().getTime() / 1000);
  7.                 let voicePath = res.tempFilePath;
  8.                 self.voicePath = voicePath;
  9.                 self.closeTimeOut();
  10.                 uni.showToast({
  11.                     icon: 'loading',
  12.                     title: "请稍后...",
  13.                     duration: 0
  14.                 });
  15.                 uni.uploadFile({
  16.                     url: self.upload_url,
  17.                     filePath: voicePath,
  18.                     name: "file",
  19.                     formData: {
  20.                         id: self.phoneInfo.id,
  21.                         start_time: self.start_time,
  22.                         end_time: self.end_time,
  23.                         phone: self.phoneNumber
  24.                     },
  25.                     header: {
  26.                         Authorization: "Bearer " + uni.getStorageSync(EnumData.token)
  27.                     },
  28.                     success: (res) => {
  29.                         // console.log("文件上传成功")
  30.                         console.log(res.data);
  31.                     },
  32.                     fail(err) {
  33.                         console.log("文件上传失败")
  34.                         console.log(err);
  35.                     },
  36.                     complete() {
  37.                         self.start_time = 0;
  38.                         self.end_time = 0;
  39.                         uni.hideToast();
  40.                     }
  41.                 })
  42.             });
  43.             this.getCallStatus();
  44. }
  45. getCallStatus() {
  46.     let that = this;
  47.     let maintest = plus.android.runtimeMainActivity();
  48.     let Contexttest = plus.android.importClass("android.content.Context");
  49.     let telephonyManager = plus.android.importClass("android.telephony.TelephonyManager");
  50.     let telManager = plus.android.runtimeMainActivity().getSystemService(Contexttest.TELEPHONY_SERVICE);
  51.     let receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
  52.         onReceive: function (Contexttest, intent) {
  53.             plus.android.importClass(intent);
  54.             let phoneStatus = telManager.getCallState();
  55.             that.callStatus = phoneStatus; //电话状态 0->空闲状态 1->振铃状态 2->通话存在
  56.             switch (phoneStatus) {
  57.                 case 0:
  58.                     console.log("3、电话挂断,上传录音")
  59.                     // 结束录音
  60.                     recorderManager.stop();
  61.                     break;
  62.                 case 1:
  63.                     // console.log('1、振铃状态');
  64.                     break;
  65.                 case 2:
  66.                     console.log('2、通话存在')
  67.                     // 延迟录音
  68.                     that.start_time = Math.round(new Date().getTime() / 1000);
  69.                     recorderManager.start({
  70.                         duration: EnumData.audioDuration, // 时长 10分钟
  71.                         sampleRate: EnumData.audioSampleRate, // 码率
  72.                     });
  73.                     break;
  74.             }
  75.         }
  76.     });
  77.     let IntentFilter = plus.android.importClass('android.content.IntentFilter');
  78.     let filter = new IntentFilter();
  79.     filter.addAction(telephonyManager.ACTION_PHONE_STATE_CHANGED);
  80.     maintest.registerReceiver(receiver, filter);
  81. },

需要申请的权限,可以放到 App.vue 中

  1. if (plus.os.name == 'Android') {
  2.       plus.android.requestPermissions(
  3.          ['android.permission.ANSWER_PHONE_CALLS',//手动 挂断和接听 需要这个权限
  4.           "android.permission.MODIFY_AUDIO_SETTINGS",//手动 挂断和接听 需要这个权限
  5.           "android.permission.CALL_PHONE",//手动 挂断和接听 需要这个权限
  6.           "android.permission.READ_PHONE_STATE",//>监听电话状态 需要这个权限
  7.           "android.permission.READ_CALL_LOG",//获取号码需要这个权限
  8.           "android.permission.READ_AUDIO" // 录音权限
  9.           ],
  10.       function(resultObj) {
  11.           var result = 0;
  12.           for (var i = 0; i < resultObj.granted.length; i++) {
  13.           var grantedPermission = resultObj.granted[i];
  14.           console.log('已获取的权限:' + grantedPermission);
  15.           result = 1
  16.       }
  17.       for (var i = 0; i < resultObj.deniedPresent.length; i++) {
  18.           var deniedPresentPermission = resultObj.deniedPresent[i];
  19.           console.log('拒绝本次申请的权限:' + deniedPresentPermission);
  20.           result = 0
  21.       }
  22.       for (var i = 0; i < resultObj.deniedAlways.length; i++) {
  23.           var deniedAlwaysPermission = resultObj.deniedAlways[i];
  24.           console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
  25.           result = -1
  26.       }
  27.      },  function(error) {
  28.           console.log('申请权限错误:' + error.code + " = " + error.message);
  29.      } );
  30. }


注意点

调试模式下可以正常监听通话挂断并且上传文件的,但是打包之后就失效?

一般的手机打包是可以正常使用的,我用的是 oneplus7 , 打包后安装正常使用,部分手机需要到系统设置的权限中,将应用的【开启手机设备状态码】进行开启即可,目前遇到的就这个。


本文网址:https://www.zztuku.com/index.php/detail-13699.html
站长图库 - 实例详解uniapp如何实现电话录音功能(附代码)
申明:本文转载于《learnku》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐

    Discuz-FC通用采集插件