症状: 点击语音按钮后,应用自动跳转到系统设置页面,而不是先弹出权限请求对话框。
- 权限之前被拒绝过 - Android 记住了"不再询问"的状态
- Alert 对话框可能被误触 - "去设置"按钮被立即触发
- 没有给用户选择的机会 - 直接跳转而不是让用户确认
方法 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. → 存储 → 清除数据
文件: utils/permissions.js
改进内容:
- ✅ 延迟显示对话框 - 避免权限对话框和 Alert 冲突
- ✅ 更清晰的提示 - 明确告诉用户为什么需要权限
- ✅ 用户可选择 - "暂不开启" vs "去设置",不会强制跳转
- ✅ 拒绝时也有提示 - 告知用户后果,但不强制跳转
关键代码:
// NEVER_ASK_AGAIN 状态处理
setTimeout(() => {
Alert.alert(
'需要麦克风权限',
'您之前拒绝了麦克风权限并选择了"不再询问"。\n\n语音功能需要麦克风权限才能工作。是否前往设置开启权限?',
[
{
text: '暂不开启',
style: 'cancel',
onPress: () => console.log('用户选择不去设置'),
},
{
text: '去设置',
style: 'default',
onPress: () => {
Linking.openSettings();
},
},
],
{ cancelable: true }
);
}, 500); // 延迟 500ms,避免立即跳转-
卸载旧版本
adb uninstall com.tiyuchong.nekorn
-
安装新版本
adb install android/app/build/outputs/apk/debug/app-debug.apk
-
打开应用,点击语音按钮
-
预期结果:
弹出权限对话框: - 标题: "🎤 需要麦克风权限" - 消息: "N.E.K.O. 需要访问您的麦克风来实现语音对话功能。" - 按钮: "确定" / "取消" / "稍后询问" -
点击"确定"
✅ 权限授予 ✅ 开始录音
-
点击语音按钮
-
弹出权限对话框
-
点击"取消"
-
预期结果:
延迟 300ms 后显示提示: - 标题: "权限被拒绝" - 消息: "您拒绝了麦克风权限,语音功能将无法使用。\n\n您可以稍后在设置中手动授予权限。" - 按钮: "知道了" ✅ 不会自动跳转设置 ✅ 用户可以继续使用文本功能
-
拒绝权限时勾选"不再询问"
-
再次点击语音按钮
-
预期结果:
延迟 500ms 后显示提示: - 标题: "需要麦克风权限" - 消息: "您之前拒绝了麦克风权限并选择了"不再询问"。\n\n语音功能需要麦克风权限才能工作。是否前往设置开启权限?" - 按钮: "暂不开启" / "去设置" ✅ 用户可以选择不去设置 ✅ 点击"去设置"才会跳转
adb logcat | grep -E '麦克风|PCMStream|权限'🔐 检查麦克风权限...
✅ 麦克风权限已授予
✅ 录音已启动 (sampleRate=48000, targetRate=16000)
❌ 用户拒绝了麦克风权限
# 然后显示提示对话框
❌ 用户选择"不再询问"
# 延迟 500ms 后显示提示
# 用户点击"去设置"才会跳转
// ❌ 直接跳转,用户没有选择权
Alert.alert('需要权限', '...', [
{ text: '取消' },
{ text: '去设置', onPress: () => Linking.openSettings() }
]);
return false;// ✅ 延迟显示,用户可以选择
setTimeout(() => {
Alert.alert('需要麦克风权限', '...\n\n是否前往设置开启权限?', [
{ text: '暂不开启', style: 'cancel' },
{ text: '去设置', onPress: () => Linking.openSettings() }
], { cancelable: true });
}, 500);
return false;- 测试前卸载旧版本 - 确保清除之前的权限状态
- 使用脚本安装 -
./scripts/reinstall-apk.sh - 查看日志确认 - 观察权限请求流程
- 不要连续点击 - 给系统时间处理权限请求
utils/permissions.js- 权限请求逻辑(已修复)services/AudioService.ts- 在 startRecording() 中调用权限请求scripts/reinstall-apk.sh- 卸载重装脚本
-
完全清除应用数据
adb shell pm clear com.tiyuchong.nekorn
-
检查日志
adb logcat -c adb logcat | grep -E 'Permission|RECORD_AUDIO|麦克风'
-
手动授予权限
adb shell pm grant com.tiyuchong.nekorn android.permission.RECORD_AUDIO
-
检查设备设置
设置 → 应用 → N.E.K.O. → 权限 → 麦克风