guoyu/fronted_uniapp/utils/permission-helper.js
2025-12-10 22:53:20 +08:00

159 lines
4.8 KiB
JavaScript

/**
* 权限请求助手
* 专门处理Android录音权限问题
*/
class PermissionHelper {
/**
* 请求录音权限(强制请求)
*/
async requestRecordPermission() {
return new Promise((resolve) => {
// #ifdef APP-PLUS
try {
console.log('[权限] 开始请求录音权限...')
// Android权限
const permissions = ['android.permission.RECORD_AUDIO']
// 检查权限状态
const checkResult = plus.android.checkPermission(permissions[0])
console.log('[权限] 当前状态:', checkResult)
if (checkResult === -1) {
// 权限被永久拒绝
console.log('[权限] 权限被永久拒绝,需要手动开启')
uni.showModal({
title: '需要录音权限',
content: '请在系统设置中手动开启录音权限',
confirmText: '去设置',
success: (res) => {
if (res.confirm) {
// 打开应用设置页面
const Intent = plus.android.importClass('android.content.Intent')
const Settings = plus.android.importClass('android.provider.Settings')
const Uri = plus.android.importClass('android.net.Uri')
const mainActivity = plus.android.runtimeMainActivity()
const intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
const uri = Uri.fromParts('package', mainActivity.getPackageName(), null)
intent.setData(uri)
mainActivity.startActivity(intent)
}
resolve(false)
}
})
} else if (checkResult === 0) {
// 权限未授予,请求权限
console.log('[权限] 请求授权...')
plus.android.requestPermissions(
permissions,
(result) => {
console.log('[权限] 授权结果:', result)
const granted = result.granted && result.granted.length > 0
if (granted) {
console.log('[权限] ✓ 授权成功')
resolve(true)
} else {
console.log('[权限] ✗ 授权被拒绝')
uni.showToast({
title: '需要录音权限才能使用',
icon: 'none',
duration: 2000
})
resolve(false)
}
},
(error) => {
console.error('[权限] 请求失败:', error)
resolve(false)
}
)
} else {
// 权限已授予
console.log('[权限] ✓ 已有权限')
resolve(true)
}
} catch (e) {
console.error('[权限] 异常:', e)
resolve(false)
}
// #endif
// #ifndef APP-PLUS
console.log('[权限] 非APP环境')
resolve(true)
// #endif
})
}
/**
* 检查麦克风是否被占用
*/
async checkMicrophoneAvailable() {
// #ifdef APP-PLUS
try {
console.log('[检查] 测试麦克风是否可用...')
// 尝试短暂录音测试
const recorder = plus.audio.getRecorder()
const testPath = '_doc/mic_test_' + Date.now() + '.wav'
return new Promise((resolve) => {
let testTimeout = setTimeout(() => {
console.log('[检查] 测试超时,麦克风可能被占用')
resolve(false)
}, 3000)
recorder.record(
{
filename: testPath,
format: 'wav',
samplerate: '8000',
channels: '1'
},
() => {
console.log('[检查] 录音测试开始')
// 立即停止
setTimeout(() => {
try {
recorder.stop()
clearTimeout(testTimeout)
console.log('[检查] ✓ 麦克风可用')
resolve(true)
} catch (e) {
console.log('[检查] 停止失败:', e)
clearTimeout(testTimeout)
resolve(false)
}
}, 500)
},
(error) => {
console.error('[检查] 录音测试失败:', error)
clearTimeout(testTimeout)
if (error.code === 3) {
console.log('[检查] 权限问题')
} else if (error.code === 4) {
console.log('[检查] 麦克风被占用')
}
resolve(false)
}
)
})
} catch (e) {
console.error('[检查] 异常:', e)
return false
}
// #endif
// #ifndef APP-PLUS
return true
// #endif
}
}
export default new PermissionHelper()