| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- //#ifdef APP-PLUS
- import {
- startPhoneListener,
- stopPhoneListener,
- checkIsAutoRecord,
- toCallAutoRecorderPage,
- navigateToCallRecordingSettings,
- jumpToPermissionPage,
- allRecorderFilesAction
- } from '@/uni_modules/yao-lister';
- // #endif
- import permision from "@/js_sdk/wa-permission/permission.js";
- import {
- formatPhoneNumber
- } from '../../utils/util';
- export default {
- namespaced: true,
- state: {
- filelist: [],
- isAutoRecord: false, // 通话自动录音状态
- hasStoragePermission: false, // 文件访问权限状态
- hasReadPhoneStatePermission: false, // 读取手机状态权限
- hasCallPhonePermission: false, // 拨打电话权限
- hasReadCallLogPermission: false, // 读取通话记录权限
- hasReadPhoneNumbersPermission: false, // 读取电话号码权限
- isPhoneListening: false, // 电话监听状态
- form: {
- clueId: undefined,
- fileUrl: undefined,
- fileName: undefined,
- type: '3',
- list: [],
- caller: '',
- callee: ''
- },
- },
- mutations: {
- SET_FILE_LIST: (state, data) => {
- state.filelist = data.data
- },
- SET_AUTO_RECORD: (state, value) => {
- state.isAutoRecord = value;
- },
- SET_STORAGE_PERMISSION: (state, value) => {
- state.hasStoragePermission = value;
- },
- SET_READ_PHONE_STATE_PERMISSION: (state, value) => {
- state.hasReadPhoneStatePermission = value;
- },
- SET_CALL_PHONE_PERMISSION: (state, value) => {
- state.hasCallPhonePermission = value;
- },
- SET_READ_CALL_LOG_PERMISSION: (state, value) => {
- state.hasReadCallLogPermission = value;
- },
- SET_READ_PHONE_NUMBERS_PERMISSION: (state, value) => {
- state.hasReadPhoneNumbersPermission = value;
- },
- SET_PHONE_LISTENING_STATUS: (state, value) => {
- state.isPhoneListening = value;
- },
- SET_CALLER_PHONE: (state, phoneNumber) => {
- state.form.caller = phoneNumber;
- },
- SET_FORM: (state, data) => {
- state.form = data;
- },
- },
- actions: {
- // 获取文件列表 - 返回Promise方式
- getFileList({
- dispatch,
- state,
- commit
- }) {
- return new Promise((resolve, reject) => {
- dispatch("checkStoragePermission").then(() => {
- if (state.hasStoragePermission) {
- allRecorderFilesAction(res => {
- if (res && res.length > 0) {
- // 将文件路径数组转换为包含filePath和fileName的对象数组
- const fileListPromise = res.map(filePath => {
- return new Promise((resolve) => {
- // 从路径中提取文件名
- const fileName = filePath.split('/')
- .pop();
- // 获取文件信息,包括创建时间
- plus.io.resolveLocalFileSystemURL(
- filePath, (entry) => {
- entry.getMetadata((
- metadata) => {
- resolve({
- filePath: filePath,
- fileName: fileName,
- createTime: metadata
- .modificationTime ?
- metadata
- .modificationTime :
- 0, // 文件创建时间
- });
- }, (error) => {
- // 如果获取metadata失败,返回基本信息
- resolve({
- filePath: filePath,
- fileName: fileName,
- createTime: 0, // 设为0,排序时会在最前面
- });
- });
- }, (error) => {
- // 如果解析文件路径失败,返回基本信息
- resolve({
- filePath: filePath,
- fileName: fileName,
- createTime: 0,
- size: 0
- });
- });
- });
- });
- // 等待所有文件信息获取完成后进行排序
- Promise.all(fileListPromise).then((fileList) => {
- // 按创建时间排序,最新的文件排在前面(降序)
- fileList.sort((a, b) => {
- return b.createTime - a.createTime;
- });
- // 提交文件列表到state
- commit('SET_FILE_LIST', {
- data: fileList
- });
- // 返回文件列表
- resolve(fileList);
- }).catch((error) => {
- console.error('获取文件列表失败:', error);
- // 即使排序失败,也尝试提交原始列表
- const fallbackFileList = res.map(filePath => {
- const fileName = filePath.split('/')
- .pop();
- return {
- filePath: filePath,
- fileName: fileName
- };
- });
- commit('SET_FILE_LIST', {
- data: fallbackFileList
- });
- resolve(fallbackFileList);
- });
- } else {
- // 没有文件时返回空数组
- commit('SET_FILE_LIST', {
- data: []
- });
- resolve([]);
- }
- })
- } else {
- dispatch("requestStoragePermission");
- reject(new Error('没有文件访问权限'));
- }
- }).catch(error => {
- reject(error);
- });
- });
- },
- // 获取用户手机号码
- getUserPhoneNumber({
- commit
- }) {
- return new Promise((resolve, reject) => {
- // 首先检查权限
- permision.requestAndroidPermission('android.permission.READ_PHONE_NUMBERS')
- .then(result => {
- if (result === 1) {
- // 权限被授予,获取手机号码
- try {
- const main = plus.android.runtimeMainActivity();
- const Context = plus.android.importClass('android.content.Context');
- const TelephonyManager = plus.android.importClass(
- 'android.telephony.TelephonyManager');
- const telephonyManager = main.getSystemService(Context.TELEPHONY_SERVICE);
- const phoneNumber = telephonyManager.getLine1Number();
- if (phoneNumber && phoneNumber.trim() !== '') {
- // 移除国际区号,保留手机号码
- const cleanPhoneNumber = formatPhoneNumber(phoneNumber);
- commit('SET_CALLER_PHONE', cleanPhoneNumber);
- resolve(cleanPhoneNumber);
- } else {
- // 获取不到手机号码
- reject(new Error('无法获取手机号码:设备可能不支持'));
- }
- } catch (error) {
- console.error('获取手机号码失败:', error);
- reject(new Error('获取手机号码失败: ' + error.message));
- }
- } else {
- reject(new Error('没有获取手机号码的权限,请前往设置开启权限'));
- }
- })
- .catch(error => {
- console.error('请求权限失败:', error);
- reject(error);
- });
- });
- },
- resetForm({
- commit
- }) {
- commit("SET_FORM", {
- clueId: undefined,
- fileUrl: undefined,
- fileName: undefined,
- type: '3',
- list: [],
- caller: '',
- callee: ''
- })
- },
- // 检查所有权限状态
- checkAllPermissions({
- commit
- }) {
- return new Promise((resolve, reject) => {
- try {
- // 检查通话自动录音状态
- const autoRecordStatus = checkIsAutoRecord();
- commit('SET_AUTO_RECORD', autoRecordStatus);
- // 检查文件访问权限
- this.dispatch('call/checkStoragePermission').then(storagePermission => {
- commit('SET_STORAGE_PERMISSION', storagePermission);
- // 检查其他权限
- const permissions = [{
- id: 'android.permission.READ_PHONE_STATE',
- mutation: 'SET_READ_PHONE_STATE_PERMISSION'
- },
- {
- id: 'android.permission.CALL_PHONE',
- mutation: 'SET_CALL_PHONE_PERMISSION'
- },
- {
- id: 'android.permission.READ_CALL_LOG',
- mutation: 'SET_READ_CALL_LOG_PERMISSION'
- },
- {
- id: 'android.permission.READ_PHONE_NUMBERS',
- mutation: 'SET_READ_PHONE_NUMBERS_PERMISSION'
- }
- ];
- const permissionPromises = permissions.map(perm => {
- return permision.requestAndroidPermission(perm.id).then(result => {
- commit(perm.mutation, result === 1);
- return {
- id: perm.id,
- granted: result === 1
- };
- });
- });
- Promise.all(permissionPromises).then(results => {
- resolve({
- autoRecordStatus,
- storagePermission,
- permissions: results
- });
- });
- });
- } catch (error) {
- reject(error);
- }
- });
- },
- // 检查文件访问权限
- checkStoragePermission({
- commit
- }) {
- return new Promise((resolve) => {
- let hasPermission = false;
- try {
- // 获取Android版本号
- let androidVersion = 0;
- uni.getSystemInfo({
- success: (res) => {
- if (res.system && res.system.includes('Android')) {
- const versionMatch = res.system.match(/Android (\d+\.?\d*)/);
- if (versionMatch && versionMatch[1]) {
- androidVersion = parseFloat(versionMatch[1]);
- }
- }
- if (androidVersion >= 11) {
- // Android 11及以上版本,使用MANAGE_EXTERNAL_STORAGE权限
- const Environment = plus.android.importClass(
- 'android.os.Environment');
- hasPermission = Environment.isExternalStorageManager();
- commit('SET_STORAGE_PERMISSION', hasPermission);
- resolve(hasPermission);
- } else {
- // Android 11以下版本,使用READ_EXTERNAL_STORAGE权限
- permision.requestAndroidPermission(
- 'android.permission.READ_EXTERNAL_STORAGE')
- .then(result => {
- hasPermission = result === 1;
- commit('SET_STORAGE_PERMISSION', hasPermission);
- resolve(hasPermission);
- });
- }
- }
- });
- } catch (e) {
- hasPermission = false;
- commit('SET_STORAGE_PERMISSION', hasPermission);
- resolve(hasPermission);
- }
- });
- },
- // 请求文件访问权限
- requestStoragePermission() {
- jumpToPermissionPage();
- },
- // 跳转到通话录音设置页面
- toCallRecorderSettings() {
- toCallAutoRecorderPage();
- },
- // 跳转到系统通话录音界面
- toSystemRecorderSettings() {
- navigateToCallRecordingSettings();
- },
- // 打开系统设置
- handleOpenSet() {
- permision.gotoAppPermissionSetting('android.permission.RECORD_AUDIO');
- },
- // 启动电话监听
- startPhoneListener({
- commit,
- dispatch,
- state
- }) {
- try {
- if (state.isPhoneListening) {
- // 已经开启监听就不要了
- return;
- }
- // 用于记录上一个状态,检测通话结束
- let previousState = null;
- dispatch("checkAllPermissions").finally(() => {
- startPhoneListener(res => {
- if (state.form.clueId) {
- // 是通过app监听打出去触发;
- dispatch("handleCallBack", {
- currentState: res,
- previousState
- });
- }
- // 更新上一个状态
- previousState = res;
- commit('SET_PHONE_LISTENING_STATUS', true);
- });
- });
- } catch (error) {
- console.error('启动电话监听失败:', error);
- commit('SET_PHONE_LISTENING_STATUS', false);
- throw error;
- }
- },
- handleCallBack({
- dispatch,
- commit,
- state
- }, {
- currentState,
- previousState
- } = {}) {
- if (previousState && currentState) {
- if (previousState === '通话中') {
- if (currentState === '空闲状态') {
- // 延迟一下再获取,确保录音文件已经生成
- setTimeout(() => {
- dispatch('getLatestRecordingFile').then((file) => {
- uni.showModal({
- title: '检测您的拨号行为,是否上传录音?',
- content: '最新一条电话录音:' + file.fileName +",是否前往关联?",
- success: function (res) {
- if (res.confirm) {
- uni.navigateTo({
- url: `/pages/uploadRecord/index?clueId=${state.form.clueId}`
- })
- } else if (res.cancel) {
- dispatch("resetForm");
- }
- }
- });
- }).catch(error => {
- uni.$u.toast('获取录音文件失败:' + error);
- });
- }, 2000); // 延迟1秒获取
- }
- }
- }
- },
- // 获取最新的录音文件并赋值给form
- getLatestRecordingFile({
- commit,
- state
- }) {
- return new Promise((resolve, reject) => {
- // 获取文件列表 - 使用return Promise的方式
- this.dispatch('call/getFileList').then((fileList) => {
- if (fileList && fileList.length > 0) {
- // 获取最新创建的录音文件(索引0是最新的)
- const latestFile = fileList[0];
- // 更新form中的fileUrl和fileName
- const updatedForm = {
- ...state.form,
- fileUrl: latestFile.filePath,
- fileName: latestFile.fileName
- };
- commit('SET_FORM', updatedForm);
- resolve(latestFile);
- } else {
- reject(new Error('未找到录音文件'));
- }
- }).catch(error => {
- console.error('获取文件列表失败:', error);
- reject(error);
- });
- });
- },
- // 停止电话监听
- stopPhoneListener({
- commit
- }) {
- try {
- // #ifdef APP-PLUS
- if (typeof stopPhoneListener === 'function') {
- stopPhoneListener(res => {
- commit('SET_PHONE_LISTENING_STATUS', false);
- });
- } else {
- commit('SET_PHONE_LISTENING_STATUS', false);
- }
- // #endif
- // #ifndef APP-PLUS
- commit('SET_PHONE_LISTENING_STATUS', false);
- // #endif
- } catch (error) {
- console.error('停止电话监听失败:', error);
- commit('SET_PHONE_LISTENING_STATUS', false);
- }
- },
- // 切换电话监听状态
- togglePhoneListener({
- state,
- dispatch
- }) {
- if (state.isPhoneListening) {
- return dispatch('stopPhoneListener');
- } else {
- return dispatch('startPhoneListener');
- }
- }
- },
- }
|