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