Skip to content

Latest commit

 

History

History
220 lines (170 loc) · 5.26 KB

File metadata and controls

220 lines (170 loc) · 5.26 KB

🔧 权限自动跳转设置问题修复

问题描述

症状: 点击语音按钮后,应用自动跳转到系统设置页面,而不是先弹出权限请求对话框。

根本原因

  1. 权限之前被拒绝过 - Android 记住了"不再询问"的状态
  2. Alert 对话框可能被误触 - "去设置"按钮被立即触发
  3. 没有给用户选择的机会 - 直接跳转而不是让用户确认

解决方案

1. 清除之前的权限状态

方法 1: 卸载重装(推荐)

# 使用脚本自动卸载重装
./scripts/reinstall-apk.sh

# 或手动操作
adb uninstall com.tiyuchong.nekorn
adb install android/app/build/outputs/apk/debug/app-debug.apk

方法 2: 手动清除应用数据

设置 → 应用 → N.E.K.O. → 存储 → 清除数据

2. 代码层面的修复

文件: utils/permissions.js

改进内容:

  1. 延迟显示对话框 - 避免权限对话框和 Alert 冲突
  2. 更清晰的提示 - 明确告诉用户为什么需要权限
  3. 用户可选择 - "暂不开启" vs "去设置",不会强制跳转
  4. 拒绝时也有提示 - 告知用户后果,但不强制跳转

关键代码:

// NEVER_ASK_AGAIN 状态处理
setTimeout(() => {
  Alert.alert(
    '需要麦克风权限',
    '您之前拒绝了麦克风权限并选择了"不再询问"。\n\n语音功能需要麦克风权限才能工作。是否前往设置开启权限?',
    [
      {
        text: '暂不开启',
        style: 'cancel',
        onPress: () => console.log('用户选择不去设置'),
      },
      {
        text: '去设置',
        style: 'default',
        onPress: () => {
          Linking.openSettings();
        },
      },
    ],
    { cancelable: true }
  );
}, 500); // 延迟 500ms,避免立即跳转

测试流程

场景 1: 首次请求权限(干净安装)

  1. 卸载旧版本

    adb uninstall com.tiyuchong.nekorn
  2. 安装新版本

    adb install android/app/build/outputs/apk/debug/app-debug.apk
  3. 打开应用,点击语音按钮

  4. 预期结果:

    弹出权限对话框:
    - 标题: "🎤 需要麦克风权限"
    - 消息: "N.E.K.O. 需要访问您的麦克风来实现语音对话功能。"
    - 按钮: "确定" / "取消" / "稍后询问"
    
  5. 点击"确定"

    ✅ 权限授予
    ✅ 开始录音
    

场景 2: 用户拒绝权限

  1. 点击语音按钮

  2. 弹出权限对话框

  3. 点击"取消"

  4. 预期结果:

    延迟 300ms 后显示提示:
    - 标题: "权限被拒绝"
    - 消息: "您拒绝了麦克风权限,语音功能将无法使用。\n\n您可以稍后在设置中手动授予权限。"
    - 按钮: "知道了"
    
    ✅ 不会自动跳转设置
    ✅ 用户可以继续使用文本功能
    

场景 3: 用户选择"不再询问"后再次尝试

  1. 拒绝权限时勾选"不再询问"

  2. 再次点击语音按钮

  3. 预期结果:

    延迟 500ms 后显示提示:
    - 标题: "需要麦克风权限"
    - 消息: "您之前拒绝了麦克风权限并选择了"不再询问"。\n\n语音功能需要麦克风权限才能工作。是否前往设置开启权限?"
    - 按钮: "暂不开启" / "去设置"
    
    ✅ 用户可以选择不去设置
    ✅ 点击"去设置"才会跳转
    

日志输出

成功场景

adb logcat | grep -E '麦克风|PCMStream|权限'
🔐 检查麦克风权限...
✅ 麦克风权限已授予
✅ 录音已启动 (sampleRate=48000, targetRate=16000)

拒绝场景

❌ 用户拒绝了麦克风权限
# 然后显示提示对话框

NEVER_ASK_AGAIN 场景

❌ 用户选择"不再询问"
# 延迟 500ms 后显示提示
# 用户点击"去设置"才会跳转

关键改进

Before (有问题)

// ❌ 直接跳转,用户没有选择权
Alert.alert('需要权限', '...', [
  { text: '取消' },
  { text: '去设置', onPress: () => Linking.openSettings() }
]);
return false;

After (已修复)

// ✅ 延迟显示,用户可以选择
setTimeout(() => {
  Alert.alert('需要麦克风权限', '...\n\n是否前往设置开启权限?', [
    { text: '暂不开启', style: 'cancel' },
    { text: '去设置', onPress: () => Linking.openSettings() }
  ], { cancelable: true });
}, 500);
return false;

预防措施

  1. 测试前卸载旧版本 - 确保清除之前的权限状态
  2. 使用脚本安装 - ./scripts/reinstall-apk.sh
  3. 查看日志确认 - 观察权限请求流程
  4. 不要连续点击 - 给系统时间处理权限请求

相关文件

  • utils/permissions.js - 权限请求逻辑(已修复)
  • services/AudioService.ts - 在 startRecording() 中调用权限请求
  • scripts/reinstall-apk.sh - 卸载重装脚本

如果问题依然存在

  1. 完全清除应用数据

    adb shell pm clear com.tiyuchong.nekorn
  2. 检查日志

    adb logcat -c
    adb logcat | grep -E 'Permission|RECORD_AUDIO|麦克风'
  3. 手动授予权限

    adb shell pm grant com.tiyuchong.nekorn android.permission.RECORD_AUDIO
  4. 检查设备设置

    设置 → 应用 → N.E.K.O. → 权限 → 麦克风