You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API Level 28(Android 9.0)下ExoPlayer播放HLS流失败问题求助

问题分析与解决方案

首先,这个问题的核心矛盾是Android 9.0(API 28)引入的网络安全限制,加上你使用的ExoPlayer版本过于老旧导致的适配问题,我们一步步来解决:

核心原因

  1. Android 9的明文HTTP拦截:从API 28开始,Android系统默认禁止App发起明文HTTP请求(仅允许HTTPS),而你的HLS流地址是http://streamIP/hls/stream.m3u8,属于明文请求,直接被系统拦截,这就是报错Unable to connect的根本原因。
  2. ExoPlayer版本过旧:你用的r2.5.2是2017年的版本,完全没有适配Android 9及以上的网络安全规则,即使你配置了允许明文,旧版本也可能存在其他兼容性问题。

解决方案

方案1:快速验证——全局允许明文HTTP(临时方案)

这个方法可以快速确认是不是明文拦截的问题,但不建议长期在生产环境使用:

  1. 在res/xml目录下创建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
  1. 在AndroidManifest.xml的<application>标签中添加配置:
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config"
    ...>
</application>

重新运行App,应该就能正常播放HLS流了。

方案2:升级ExoPlayer到适配版本(推荐长期方案)

r2.5.2实在太老了,不仅适配问题多,很多新的HLS特性也不支持,建议升级到稳定的新版本,比如r2.18.1(当前比较稳定的版本之一):
修改app/build.gradle中的依赖:

// 替换原来的exoplayer依赖
implementation 'com.google.android.exoplayer:exoplayer:r2.18.1'
// 如果你只需要HLS播放支持,也可以只引入HLS模块,减少APK体积:
// implementation 'com.google.android.exoplayer:exoplayer-hls:r2.18.1'

注意:升级后部分旧API可能有变动,比如播放控制、数据源配置等,你需要根据ExoPlayer的版本迁移说明调整代码。

方案3:允许特定域名的明文HTTP(更安全的折中方案)

如果不想全局放开明文请求,只想给你的流服务器域名开例外,修改network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <!-- 替换成你的实际流服务器域名或IP,includeSubdomains=true表示包含子域名 -->
        <domain includeSubdomains="true">streamIP</domain>
    </domain-config>
</network-security-config>

然后同样在Manifest中配置这个文件,这样既解决了当前问题,又不会让其他域名的明文请求被允许,安全性更高。

验证步骤

  1. 先尝试方案1,确认播放正常,验证是明文拦截的问题;
  2. 再切换到方案3,保证安全性;
  3. 最后升级ExoPlayer到新版本,避免后续其他适配问题。

内容的提问来源于stack exchange,提问作者MrPool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:47:14