yx_speech_to_text_flutter/权限问题解决指南.md

4.4 KiB
Raw Permalink Blame History

🎤 麦克风权限问题解决指南

🎯 问题确认

根据调试日志,问题已经确定:

flutter: ❌ [YxAsr] 麦克风权限被拒绝

不是模型文件问题,而是麦克风权限问题!

🔧 已完成的修复

1. 增强权限检查逻辑

  • 添加了详细的权限状态检查
  • 区分不同的权限拒绝情况
  • 提供针对性的错误提示

2. 改进错误处理

  • 永久拒绝:引导用户到设置页面
  • 临时拒绝:提供重试选项
  • 权限受限:明确说明原因

3. 优化用户体验

  • 中文错误提示
  • 操作指导按钮
  • 重试机制

📱 解决方案

方案 1重新授权推荐

步骤 1删除应用

  1. 长按应用图标
  2. 选择"删除应用"
  3. 确认删除

步骤 2重新安装

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. 重新构建应用

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. 权限请求时机

// 在用户点击录音按钮时请求权限,而不是应用启动时
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. 应用启动时初始化成功
  2. 无权限错误提示
  3. 录音功能正常工作
  4. 语音识别结果正确显示

现在请按照方案 1 重新安装应用并正确授权! 🚀