Android Studio中VideoView加载视频显示问号无法播放如何解决
VideoView加载raw视频显示问号无法播放的排查与修复
核心错误修复
你当前代码存在两个直接导致播放失败的显性问题:
- 资源URI拼写错误:你手动拼接的URI scheme写为
android.resources://(resources为复数),Android系统raw资源的合法访问scheme是android.resource://(resource为单数,无末尾s),拼写错误会直接导致系统无法定位到视频文件,VideoView加载失败就会显示问号占位符。 - 缺少播放触发逻辑:仅设置URI和媒体控制器不会自动开始播放,需要等待资源准备完成后主动调用播放方法,或通过媒体控制器手动触发。
将原代码中设置URI的部分替换为如下代码即可解决显性错误:
public class MainActivity extends AppCompatActivity { VideoView videoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView=findViewById(R.id.video); MediaController mediaController= new MediaController(this); mediaController.setAnchorView(videoView); // 补全控制器锚点设置,避免控制器显示位置异常 mediaController.setMediaPlayer(videoView); videoView.setMediaController(mediaController); // 修正URI拼写,不要手动拼接时写错scheme Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.animation); videoView.setVideoURI(videoUri); // 增加播放状态监听 videoView.setOnPreparedListener(mp -> { // 资源准备完成后自动播放,不需要手动点控制器按钮 videoView.start(); }); videoView.setOnErrorListener((mp, what, extra) -> { // 打印错误码定位深层问题:what=1代表视频格式不支持,what=-1004代表资源读取失败 Log.e("VideoPlayError", "错误码what:"+what+" extra:"+extra); return false; }); } @Override protected void onPause() { super.onPause(); // 页面退到后台时暂停播放 if (videoView != null && videoView.isPlaying()) { videoView.pause(); } } @Override protected void onDestroy() { super.onDestroy(); // 页面销毁时释放播放器资源,避免内存泄漏 if (videoView != null) { videoView.stopPlayback(); } } }
剩余排查点(如果修正上述代码后仍无法播放,按顺序检查)
- 检查视频文件命名与存放路径
视频文件必须放在res/raw目录下(没有该目录就手动新建),文件名只能包含小写字母、数字、下划线,不能有大写字母、中文、特殊符号,且不能以数字开头,否则R类生成的资源ID会映射异常,导致找不到文件。 - 检查视频编码兼容性
VideoView基于系统原生MediaPlayer实现,支持的编码格式受系统版本限制,优先将视频转码为H.264 Baseline Profile编码+AAC音频编码的MP4格式,不要使用webm、hevc、mkv等兼容性差的格式,否则会直接报格式不支持的错误。 - 检查视频文件大小
如果视频文件大小超过100MB,Android构建时会对raw目录下的大文件做压缩处理,导致文件损坏无法播放,大体积视频建议放到assets目录,或者推送到应用私有存储后再加载。 - 检查布局配置
确认布局文件中VideoView的id为video,宽高属性没有设置为0dp且无对应约束,测试阶段可以先给VideoView设置固定宽高(比如android:layout_width="300dp" android:layout_height="200dp"),排除布局尺寸异常导致的显示问题。
内容的提问来源于stack exchange,提问作者Waji ul hasnanin
相关产品推荐
相关产品推荐

