Android MediaPlayer 在API 28的手机上播放本地视频正常,播放网络视频,报错:what=1, extra=-2147483648
在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!