如何将Expo音频录制文件保存至设备下载文件夹?
解决Expo录音文件保存到安卓下载文件夹的问题
早上好!针对你想把录制的音频文件保存到设备下载文件夹的需求,我会结合你提供的代码给出具体的实现方案:
核心思路
Expo的FileSystem模块提供了文件复制的API,我们可以把录音生成的临时文件复制到安卓系统的下载目录,这个目录可以通过FileSystem.DownloadDirectory直接获取,无需手动拼接路径。
步骤实现
1. 配置安卓权限(必要)
首先需要在你的app.json中添加文件写入权限,确保应用能访问设备存储:
{ "expo": { "android": { "permissions": ["WRITE_EXTERNAL_STORAGE"] } } }
2. 修改你的录音停止逻辑
在你现有的_stopRecordingAndEnablePlayback方法中,添加文件复制的逻辑,具体代码如下:
async _stopRecordingAndEnablePlayback() { this.setState({ isLoading: true }); try { await this.recording.stopAndUnloadAsync(); } catch (error) { // 忽略已卸载的情况 } // 获取录音文件的信息 const recordingUri = this.recording.getURI(); const info = await FileSystem.getInfoAsync(recordingUri); console.log(`原文件信息: ${JSON.stringify(info)}`); if (info.exists) { // 构建下载目录的目标路径:提取原文件名,或者自定义文件名 const fileName = recordingUri.split('/').pop(); const downloadPath = `${FileSystem.DownloadDirectory}${fileName}`; try { // 复制文件到下载目录 await FileSystem.copyAsync({ from: recordingUri, to: downloadPath }); console.log(`文件已保存到下载目录: ${downloadPath}`); // 这里可以添加成功提示,比如Alert.alert("保存成功", "文件已存入下载文件夹") } catch (copyError) { console.error("保存文件失败:", copyError); } } // 恢复音频模式 await Audio.setAudioModeAsync({ allowsRecordingIOS: false, interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX, playsInSilentModeIOS: true, playsInSilentLockedModeIOS: true, shouldDuckAndroid: true, interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX, playThroughEarpieceAndroid: false, staysActiveInBackground: true, }); this.setState({ isLoading: false }); }
关键说明
FileSystem.DownloadDirectory:Expo提供的常量,直接指向安卓系统的公共下载文件夹(用户可以通过系统文件管理器的“下载”目录找到)。- 文件复制逻辑:我们先通过原录音URI提取文件名,再拼接下载目录路径,最后用
copyAsync完成复制操作,同时处理可能的复制错误。 - 状态更新:记得在最后把
isLoading设回false,避免加载状态一直显示。
这样修改后,每次停止录音时,文件就会自动保存到安卓的下载文件夹里啦~
内容的提问来源于stack exchange,提问作者Tilen




