4.4 KiB
4.4 KiB
🎤 麦克风权限问题解决指南
🎯 问题确认
根据调试日志,问题已经确定:
flutter: ❌ [YxAsr] 麦克风权限被拒绝
不是模型文件问题,而是麦克风权限问题! ✅
🔧 已完成的修复
1. ✅ 增强权限检查逻辑
- 添加了详细的权限状态检查
- 区分不同的权限拒绝情况
- 提供针对性的错误提示
2. ✅ 改进错误处理
- 永久拒绝:引导用户到设置页面
- 临时拒绝:提供重试选项
- 权限受限:明确说明原因
3. ✅ 优化用户体验
- 中文错误提示
- 操作指导按钮
- 重试机制
📱 解决方案
方案 1:重新授权(推荐)
步骤 1:删除应用
- 长按应用图标
- 选择"删除应用"
- 确认删除
步骤 2:重新安装
cd example
flutter run -d "00008101-0011384A0C93001E"
步骤 3:正确授权
- 应用启动时会弹出权限请求
- 点击"允许" ✅
- 不要点击"不允许" ❌
方案 2:手动设置权限
iOS 设置路径:
设置 > 隐私与安全性 > 麦克风 > YX ASR Example > 开启
详细步骤:
- 打开 iPhone 设置
- 滚动到"隐私与安全性"
- 点击"麦克风"
- 找到"YX ASR Example"
- 将开关打开(绿色状态)
方案 3:应用内重试
如果应用已经安装:
- 打开应用
- 看到权限错误弹窗
- 点击"重试"按钮
- 在权限弹窗中选择"允许"
🔍 权限状态说明
✅ 正常状态
flutter: 🔍 [YxAsr] 当前权限状态: PermissionStatus.granted
flutter: ✅ [YxAsr] 麦克风权限检查通过
❌ 拒绝状态
flutter: 🔍 [YxAsr] 当前权限状态: PermissionStatus.denied
flutter: ❌ [YxAsr] 用户拒绝了麦克风权限
⚠️ 永久拒绝
flutter: 🔍 [YxAsr] 当前权限状态: PermissionStatus.permanentlyDenied
flutter: ❌ [YxAsr] 麦克风权限被永久拒绝,需要用户手动在设置中开启
🧪 测试验证
1. 重新构建应用
cd example
flutter clean
flutter pub get
cd ios && unset GEM_PATH && unset GEM_HOME && /opt/homebrew/bin/pod install && cd ..
flutter run -d "00008101-0011384A0C93001E"
2. 观察日志输出
正确的日志应该是:
flutter: 🔍 [YxAsr] initializeWithDefaultModel() 被调用
flutter: 🔍 [YxAsr] 检查麦克风权限...
flutter: 🔍 [YxAsr] 当前权限状态: PermissionStatus.granted
flutter: ✅ [YxAsr] 麦克风权限检查通过
flutter: 🔍 [YxAsr] 模型文件路径:
flutter: - encoder: packages/yx_asr/assets/models/encoder-epoch-99-avg-1.int8.onnx
flutter: ✅ [YxAsr] 初始化成功!
3. 功能测试
- ✅ 应用启动无错误
- ✅ 录音按钮可点击
- ✅ 点击录音按钮开始录音
- ✅ 说话时有实时识别结果
🚨 常见问题
Q1: 为什么第一次就拒绝了权限?
A: 可能是用户习惯性点击"不允许",或者没有看清楚权限说明。
Q2: 如何避免权限被拒绝?
A:
- 在权限请求前显示说明
- 使用清晰的权限说明文字
- 在合适的时机请求权限
Q3: 权限被永久拒绝怎么办?
A: 只能引导用户到系统设置中手动开启,或者删除应用重新安装。
💡 最佳实践
1. 权限请求时机
// 在用户点击录音按钮时请求权限,而不是应用启动时
void _onRecordButtonPressed() async {
final hasPermission = await _speechService.hasPermission();
if (!hasPermission) {
// 显示权限说明对话框
_showPermissionExplanation();
} else {
// 开始录音
_startRecording();
}
}
2. 权限说明
void _showPermissionExplanation() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('需要麦克风权限'),
content: Text('为了进行语音识别,应用需要访问您的麦克风。请在下一步中选择"允许"。'),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
_requestPermissionAndStart();
},
child: Text('我知道了'),
),
],
),
);
}
🎉 解决确认
权限问题解决后,您应该看到:
- ✅ 应用启动时初始化成功
- ✅ 无权限错误提示
- ✅ 录音功能正常工作
- ✅ 语音识别结果正确显示
现在请按照方案 1 重新安装应用并正确授权! 🚀