欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android MediaPlayer 在API 28的手机上播放本地视频正常,播放网络视频,报错:what=1, extra=-2147483648

程序员文章站 2022-06-15 16:08:46
...

在Android开发视频播放器的过程中,发现一个怪异的Bug:

我是采用MediaPlayer+GLSurface实现的视频播放器,并且作为依赖库在Module中开发的。我利用下面的代码设置播放源:

MediaPlayer mediaPlayer = new MediaPlayer();
MediaPlayer.setDataSource(android.content.Context, android.net.Uri);

此处只写用到的代码,其他代码省略。

其中Uri有两种形式:

        1.本地视频资源的地址;

        2.网络视频资源的网址。

 

1.本地视频资源的地址:

File videoFile = new File(Environment.getExternalStorageDirectory().toString()
        + File.separator + "testVideo.mp4");
if (videoFile.exists() && videoFile.isFile()) {
   Uri videoUri = Uri.fromFile(videoFile);
}

2.网络视频资源的地址:

//此处的地址是捏造的假地址,如有雷同,纯属巧合。
Uri videoUri = Uri.parse("http://google/driver/video/8169586b.mp4");

问题描述:

        当我在API=27及以下的手机上和模拟机上测试时,两种方式均能够正常播放视频。但是当在API=28的手机和模拟机上测试时,可以正常播放本地视频,播放网络视频时,MediaPlayer的OnErrorListener捕获到了错误,参数值是:what=1,  extra=-2147483648

        查看错误值 (1, -2147483648)时,“1”值对应于MediaPlayer.MEDIA_ERROR_UNKNOWN中的常亮;“-2147483648”值对应十六进制0x80000000,在frameworks / native / include / utils / Errors.h中定义为UNKNOWN_ERROR。这表明错误的源很难确定,因为它是一个非常通用的返回值,由编解码器和兼容性问题抛出,但也有线程取消和其他几种类型。总之,就是UNKNOWN的ERROR。

 

问题解决:  几经周折,我修改了一下主工程的Build.gradle文件中的Target_Version。

       我主工程的Build.gradle文件中的Target_Version=28, 依赖库中的Build.gradle文件中的Target_Version=28。我把主工程的Target_Version修改成27之后,再运行程序,发现能够正常播放网络视频。再测试了27以下的几个值,也都正常。然而,依赖库中的Build.gradle文件中的Target_Version无论修改成什么值,对这个问题毫无积极影响。

 

后遗症:

       可是,我的依赖库未来是要用到一些不确定的主工程中的,我哪管得了别人主工程的Target_Version值,万一依赖到Target_Version=28的主工程上,那问题还是没有解决的。

 

如果有哪位大神知道答案,欢迎评论留言,3X!