You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android MediaPlayer播放用户选择音乐文件时抛出FileNotFound异常求助

解决MediaPlayer抛出FileNotFoundException的问题

嘿,我一眼就瞅出问题所在了——你处理ACTION_GET_CONTENT返回的Uri时踩了个常见坑:你存储的是Uri的getPath()结果,但这个路径根本不是真实的文件系统路径。

从堆栈跟踪里的错误路径/external/audio/media/167714就能看出来,这只是Content Provider内部的标识路径,不是手机存储里实际存在的文件路径。你给它硬加file:///前缀后,系统自然找不到这个“不存在的文件”。

修复方案

其实完全不用把Uri转成文件路径,直接存储和使用内容Uri就可以,MediaPlayer本身就支持通过内容Uri加载音频。

步骤1:修改onActivityResult,存储Uri的完整字符串

把原来存getPath()的逻辑改成存储Uri的完整字符串:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
        if ((data != null) && (data.getData() != null)) {
            Uri audioFileUri = data.getData();
            // 存储Uri的完整字符串,而非getPath()的结果
            String uriString = audioFileUri.toString();
            DatabaseInteractor.getDatabaseInteractor(this.getContext()).updateSetting(DatabaseInteractor.SETTING_MUSIC_FILE, uriString);
            Navigation.findNavController(mView).navigate(SettingsDirections.actionSettingsSelf());
        }
    }
}

步骤2:修改playMusic方法,直接使用存储的Uri字符串

去掉手动拼接的file:///前缀,直接解析存储的Uri字符串传给MediaPlayer:

private void playMusic() {
    String uriString = DatabaseInteractor.getDatabaseInteractor(getContext()).getSetting(DatabaseInteractor.SETTING_MUSIC_FILE);
    Uri uri = Uri.parse(uriString);
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        mediaPlayer.setDataSource(getActivity().getApplicationContext(), uri);
        mediaPlayer.prepare();
        mediaPlayer.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

为什么这样能解决问题?

ACTION_GET_CONTENT返回的是内容Uri(格式通常是content://media/external/audio/media/xxxx),这个Uri可以直接被Android组件(包括MediaPlayer)通过ContentResolver访问,不需要转成文件路径。而且这种方式更适配Android 10及以上的Scoped Storage机制,能避免很多权限相关的麻烦。

如果之前数据库里已经存了错误的路径,记得先清空旧数据,或者在代码里做兼容判断哦。

内容的提问来源于stack exchange,提问作者Kinnara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:09:18