使用ExoPlayer播放Raw资源报错:无法连接android.resource://
问题原因分析
这个错误的核心原因是:你用android.resource://格式的Uri加载raw本地资源时,ExoPlayer默认会调用HttpDataSource(专门处理网络资源的数据源)去尝试连接,而本地raw资源需要用RawResourceDataSource处理,两者不匹配导致连接失败。
解决方案步骤
步骤1:生成正确的资源Uri
别手动拼接android.resource://字符串,用系统提供的方式生成标准Uri,避免格式错误:// 方式1:用包名+资源ID生成 Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.your_video_file); // 方式2:用ContentResolver的常量更规范 Uri videoUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/" + R.raw.your_video_file);注意替换
your_video_file为你raw目录下的视频文件名(不带后缀,比如视频是intro.mp4就写intro)。步骤2:让ExoPlayer适配本地资源加载
如果是默认初始化的ExoPlayer,直接用生成的Uri创建MediaItem即可,ExoPlayer会自动匹配对应的数据源:ExoPlayer player = new ExoPlayer.Builder(context).build(); MediaItem mediaItem = MediaItem.fromUri(videoUri); player.setMediaItem(mediaItem); player.prepare(); player.play();要是你自定义了数据源工厂,必须把
RawResourceDataSource.Factory加入,确保能处理本地资源:DefaultDataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(context) .setDataSourceFactory(new RawResourceDataSource.Factory(context)); ExoPlayer player = new ExoPlayer.Builder(context) .setDataSourceFactory(dataSourceFactory) .build();步骤3:检查资源文件合法性
- 确认视频文件放在
res/raw目录下,文件名只能用小写字母、数字、下划线,不能有大写或特殊字符 - 检查
R.raw.your_video_file是否能正确引用到资源,别写错文件名
- 确认视频文件放在
步骤4:确认ExoPlayer依赖版本
用最新稳定版避免兼容问题,比如:implementation "com.google.android.exoplayer:exoplayer-core:2.19.1" implementation "com.google.android.exoplayer:exoplayer-ui:2.19.1" // 用UI组件才加这个
错误示例对比
你之前的错误Uri格式有问题,正确格式应该是android.resource://包名/资源ID,而不是把包名和资源ID连在一起:
// 错误写法 Uri wrongUri = Uri.parse("android.resource://com.onBoarding.app2131689472"); // 正确写法 Uri rightUri = Uri.parse("android.resource://com.onBoarding.app/2131689472");
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

