Android使用react-native-video的ExoPlayer播放“Unrecognized media format”

在Android项目是引入react-native-video可以查看我之前的文章。
  • 前言

开开心心的引入react-native-video,并且快乐的使用着,模拟器正常播放,大部分安卓手机也正常播放。

但是事情就发生在发布前夜,手持小米8(Android9 , API 28)的我正测试着,打开视频一看居然播放不出来,其他手机测试都没问题啊,为啥?miui?小米?miui?小米?是他们的锅吗?

于是我谨慎的点击了几次手机版本号,打开开发者模式,连上手机,debug测试。并且调出onError回调,小心翼翼的点开一个视频,大概过了漫长的1s,一片红到来。

onError回调:

{"error":{"errorException":"Unable to connect to http://xxx.mp4","errorString":"Unrecognized media format"}}
  • 瞎扯

嗯,从上图看,很明显是ExoPlayer的锅,那么我改用原生的MediaPlayer播放,改的不亦乐乎,于是乎又不行,出现下面报错,什么鬼?

05-13 14:32:20.090 32102-32223/com.xxx E/MediaPlayerNative: error (1, -2147483648)
05-13 14:32:20.091 32102-32102/com.xxx E/MediaPlayer: Error (1,-2147483648)
  • 认真起来

经过很长时间的折腾,加上时间紧急,头脑一片混乱。喝杯咖啡冷静一下,从一开始的报错排查,于是换回ExoPlayer播放器。

脑子里只有以下两点问题

1、ExoPlaterImplInternal:Source error.    
2、Unrecognized media format

忽然眼前一亮,发现不止一个异常信息,我忽略了这个

Caused by: java.net.UnknownServiceException: CLEARTEXT communication to xxx.com not permitted by network security policy
  • 问题分析

Android P (API27 以上) 限制了明文流量的请求,这样的请求会被系统禁止掉。而我用的视频地址是http,而非https,这样就会导系统禁止该请求,然而导致播放失败。刚好我的targetSdkVersion=28。

  • 问题解决

面对这个问题,项目发布之际,不可能修改视频地址,于是想到如下解决办法:
在Android项目中的res目录下新建xml目录,新建network_security_config.xml文件,xml文件配置如下:



    

随后,在AndroidManifest.xml文件中设置:


        //...

  • 测试

ok,没问题,手机终于可以正常播放了!

如果同样是使用ReactNative双平台开发的朋友们,不妨关注我,我们一起入坑。

觉得文章对您有用,请点个赞或者赞赏(是一种美德),感谢!

你可能感兴趣的:(Android使用react-native-video的ExoPlayer播放“Unrecognized media format”)