/** * 权限请求助手 * 专门处理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()