在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文件配置如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
</network-security-config>
随后,在AndroidManifest.xml文件中设置:
<application
...
android:networkSecurityConfig="@xml/network_security_config"
... >
//...
</application>
-
测试
ok,没问题,手机终于可以正常播放了!
如果同样是使用ReactNative双平台开发的朋友们,不妨关注我,我们一起入坑。
觉得文章对您有用,请点个赞或者赞赏(是一种美德),感谢!
网友评论