含问号的本地路径无法在ExoPlayer播放的解决方案咨询
解决ExoPlayer播放带问号文件名本地音乐的问题
嘿,我刚好踩过这个坑!问题出在Uri.parse()的解析逻辑上,咱们一步步来解决:
问题根源
当你用Uri.parse(path)处理带问号的本地文件路径时,Android的Uri解析器会把问号当成URL查询参数的起始标记,而不是文件名的一部分。比如你的路径/storage/emulated/0/mymusic/downloads/How am I?_009.mp3,会被解析成:
- 路径部分:
/storage/emulated/0/mymusic/downloads/How am I? - 查询参数:
_009.mp3
这就导致ExoPlayer找错了文件,自然播放失败。
可行解决办法(无需替换问号)
直接用File类来生成正确的Uri,它会自动转义文件名里的特殊字符:
1. 用File构造正确的Uri
替换原来的Uri.parse(path)逻辑,改用File.toUri()方法:
// 你的原始文件路径 String filePath = "/storage/emulated/0/mymusic/downloads/How am I?_009.mp3"; // 创建File对象 File musicFile = new File(filePath); // 生成正确转义的Uri Uri musicUri = musicFile.toUri();
这个方法会把文件名里的问号转义成%3F,最终生成的Uri是:file:///storage/emulated/0/mymusic/downloads/How%20am%20I%3F_009.mp3
ExoPlayer能正确识别这个Uri指向的文件。
2. 用这个Uri创建MediaSource
接下来正常创建MediaSource即可:
ExtractorMediaSource.Factory factory = new ExtractorMediaSource.Factory(new DefaultDataSourceFactory(context, "your-app-name")); MediaSource mediaSource = factory.createMediaSource(musicUri); exoPlayer.prepare(mediaSource);
3. 额外检查:权限问题
别忘了确认你的应用已经获取了读取外部存储的权限:
- Android 9及以下:申请
READ_EXTERNAL_STORAGE权限 - Android 10及以上:可以通过
MediaStore访问文件,或者申请MANAGE_EXTERNAL_STORAGE权限(如果是针对特定目录的文件,也可以用SAF存储访问框架)
为什么Uri.parse不行?
Uri.parse()是为解析HTTP/HTTPS URL设计的,它严格遵循URL语法规则,把问号当作查询参数的分隔符。但本地文件路径里的问号只是文件名的普通字符,不属于URL的查询部分,所以不能用这个方法解析带特殊字符的本地路径。
内容的提问来源于stack exchange,提问作者nebyan
相关产品推荐
相关产品推荐

