最近需要實現一個通過 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 , 打包後安裝正常使用,部分手機需要到系統設定的許可權中,將應用的【開啟手機裝置狀態碼】進行開啟即可,目前遇到的就這個。
推薦學習:《》
以上就是範例詳解uniapp如何實現電話錄音功能(附程式碼)的詳細內容,更多請關注TW511.COM其它相關文章!