UNPKG

im-ui-mobile

Version:

A Vue3.0 + Typescript instant messaging component library for Uniapp

297 lines (258 loc) 6.67 kB
/** * 录音管理器类 */ class RecorderApp { /** * 构造函数 * @param {Object} options - 配置选项 * @param {Function} options.getToken - 获取token的函数 * @param {string} options.uploadUrl - 上传URL */ constructor(options = {}) { // 获取录音管理器 this.rc = uni.getRecorderManager(); // 配置参数 this.getToken = options.getToken || (() => ''); this.uploadUrl = options.uploadUrl || ''; // 录音开始时间 this.startTime = null; // 绑定事件处理器 this.bindEventHandlers(); } /** * 绑定事件处理器 * @private */ bindEventHandlers() { // 录音开始回调 this.rc.onStart(() => { this.startTime = new Date(); if (this.onStartCallback) { this.onStartCallback(); } }); // 录音错误回调 this.rc.onError((e) => { console.log("录音错误:", e); if (this.onErrorCallback) { this.onErrorCallback(e); } }); // 录音停止回调 this.rc.onStop((wavFile) => { if (this.onStopCallback) { this.onStopCallback(wavFile); } }); } /** * 设置配置 * @param {Object} options - 配置选项 */ setOptions(options) { if (options.getToken) { this.getToken = options.getToken; } if (options.uploadUrl) { this.uploadUrl = options.uploadUrl; } } /** * 获取配置 * @returns {Object} 当前配置 */ getOptions() { return { getToken: this.getToken, uploadUrl: this.uploadUrl }; } /** * 检查是否支持录音功能 * @returns {boolean} 是否支持录音 */ checkIsEnable() { // 这里可以添加更详细的兼容性检查 return true; } /** * 开始录音 * @returns {Promise<void>} 录音开始Promise */ start() { return new Promise((resolve, reject) => { // 设置开始回调 this.onStartCallback = () => { this.onStartCallback = null; resolve(); }; // 设置错误回调 this.onErrorCallback = (e) => { this.onErrorCallback = null; reject(e); }; // 开始录音 this.rc.start({ format: "mp3", // 录音格式,可选值:aac/mp3 }); }); } /** * 停止录音 */ close() { this.rc.stop(); } /** * 上传录音文件 * @returns {Promise<Object>} 上传结果Promise */ upload() { return new Promise((resolve, reject) => { // 设置停止回调 this.onStopCallback = (wavFile) => { this.onStopCallback = null; this.handleFileUpload(wavFile, resolve, reject); }; // 停止录音 this.rc.stop(); }); } /** * 处理文件上传 * @private * @param {Object} wavFile - 录音文件对象 * @param {Function} resolve - Promise resolve函数 * @param {Function} reject - Promise reject函数 */ handleFileUpload(wavFile, resolve, reject) { // 检查是否有开始时间 if (!this.startTime) { reject(new Error("录音开始时间未记录")); return; } // 获取令牌 const accessToken = this.getToken(); if (!accessToken) { reject(new Error("未找到访问令牌")); return; } // 检查基础URL if (!this.uploadUrl) { reject(new Error("未配置API基础URL")); return; } // 上传文件 uni.uploadFile({ url: this.uploadUrl, header: { accessToken: accessToken, }, filePath: wavFile.tempFilePath, name: "file", success: (res) => { try { const r = JSON.parse(res.data); if (r.code !== 200) { reject(new Error(r.message || "上传失败")); return; } // 计算录音时长 const duration = (new Date().getTime() - this.startTime.getTime()) / 1000; const data = { duration: Math.round(duration), url: r.data, }; resolve(data); } catch (error) { console.error(error); reject(new Error("解析响应数据失败")); } }, fail: (e) => { reject(e); }, }); } /** * 获取录音时长 * @returns {number|null} 录音时长(秒),如果未开始录音则返回null */ getDuration() { if (!this.startTime) { return null; } return (new Date().getTime() - this.startTime.getTime()) / 1000; } /** * 重置录音状态 */ reset() { this.startTime = null; this.onStartCallback = null; this.onErrorCallback = null; this.onStopCallback = null; } /** * 销毁录音管理器 */ destroy() { this.rc.stop(); this.reset(); // 移除所有事件监听 this.rc.onStart(() => {}); this.rc.onError(() => {}); this.rc.onStop(() => {}); } /** * 静态方法:创建录音管理器实例 * @param {Function} getToken - 获取token的函数 * @param {string} uploadUrl - API基础URL * @returns {RecorderApp} 录音管理器实例 */ static create(getToken, uploadUrl) { return new RecorderApp({ getToken, uploadUrl }); } } // 导出类 export default RecorderApp; // 使用示例: /* import RecorderApp from './recorderApp.js'; import { getToken } from './auth.js'; // 创建实例 const recorder = new RecorderApp({ getToken: getToken, uploadUrl: 'https://api.example.com/file/upload' }); // 或使用静态方法创建 const recorder2 = RecorderApp.create(getToken, 'https://api.example.com/file/upload'); // 使用录音功能 async function recordAudio() { try { // 检查支持 if (!recorder.checkIsEnable()) { console.log('设备不支持录音'); return; } // 开始录音 await recorder.start(); console.log('录音开始'); // 录音中... await new Promise(resolve => setTimeout(resolve, 3000)); // 停止并上传 const result = await recorder.upload(); console.log('录音上传成功:', result); } catch (error) { console.error('录音失败:', error); } } // 获取录音时长 const duration = recorder.getDuration(); console.log('当前录音时长:', duration); // 重置录音状态 recorder.reset(); // 销毁录音管理器 recorder.destroy(); */