159 lines
4.8 KiB
JavaScript
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()
|