使用react-native-track-player无法播放音频,报android-io-file-not-found错误求助
解决react-native-track-player的
android-io-file-not-found错误 针对你遇到的传入有效HTTP音频链接却触发文件找不到的问题,以下是几个针对性的排查和解决步骤:
1. 开启Android明文流量权限
Android 9(API级别28)及以上默认禁止明文HTTP流量,你的链接是HTTP协议,这大概率是核心问题:
- 打开
android/app/src/main/AndroidManifest.xml - 在
<application>标签中添加android:usesCleartextTraffic="true",确保标签格式如下:<application ... android:usesCleartextTraffic="true"> ... </application> - 同时确认文件中已声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
2. 验证音频链接的设备可访问性
即使你在电脑上能打开链接,Android设备可能因为网络环境(比如代理、地区限制)无法访问:
- 在测试设备的浏览器中直接打开该音频链接,确认能正常播放
- 用
curl命令检查链接响应:
确保返回的curl -I http://music.wufazhuce.com/FkX6nZfSWVRRGacxHWGSZ2-SpjtPContent-Type是音频类型(比如audio/mpeg),且HTTP状态码为200。
3. 优化初始化逻辑,避免重复操作
原代码中组件挂载时和播放时可能重复调用setup,导致轨道状态混乱:
- 将
url加入useEffect的依赖数组,确保URL变化时重新初始化轨道:useEffect(() => { setup(); }, [url]); // 依赖url变化触发重新设置 - 简化
togglePlayback逻辑,避免重复初始化:async function togglePlayback() { try { const state = await TrackPlayer.getPlaybackState(); if (state === TrackPlayer.STATE_NONE) { await setup(); await TrackPlayer.play(); setIconName('pause-circle'); } else if (state === TrackPlayer.STATE_PLAYING) { await TrackPlayer.pause(); setIconName('play-circle'); } else { await TrackPlayer.play(); setIconName('pause-circle'); } } catch (err) { console.error('Playback error:', err); } }
4. 检查TrackPlayer版本与配置
不同版本的react-native-track-player对音频源的处理可能有差异:
- 确保使用稳定版本(比如v3.x或v4.x),避免测试版
- 确认Android项目中已按照官方要求配置音频服务类
5. 增加错误捕获,定位详细问题
在关键逻辑中添加try-catch,打印完整错误信息:
async function setup() { try { await TrackPlayer.setupPlayer({}); await TrackPlayer.reset(); console.log('Attempting to add track with URL:', url); await TrackPlayer.add({ id: 'trackId', url: url, title: 'Example Track', artist: 'Example Artist', }); } catch (error) { console.error('Setup failed with details:', JSON.stringify(error)); } }
内容的提问来源于stack exchange,提问作者Sita Tan
相关产品推荐
相关产品推荐

