Android端使用Bunny CDN时VideoPlayer报401 Unauthorized问题求助
Android端Flutter加载Bunny CDN视频报401错误的解决方案
问题背景
在Android平台使用Flutter的video_player插件加载Bunny CDN视频时,执行以下代码出现401权限错误:
@override void initState() { super.initState(); controller = VideoPlayerController.networkUrl(Uri.parse(widget.video), httpHeaders: {"AccessKey": CDN_READ_ONLY_TOKEN}); controller.initialize(); }
错误日志核心信息:
E/ExoPlayerImplInternal(14202): Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 401
矛盾点:
- iOS端相同逻辑运行正常
- 应用内普通GET请求携带相同Header可正常获取Bunny CDN资源
已尝试添加网络权限、明文流量配置、URL拼接AccessKey、配置网络安全策略等方案,均未解决。
解决方案:自定义ExoPlayer数据源传递Header
Flutter的video_player在Android端依赖ExoPlayer,默认的VideoPlayerController.networkUrl存在Header传递不完整的问题(尤其是重定向场景),需通过自定义数据源工厂确保Header被正确携带:
- 确保依赖最新版
video_player(无需额外添加exoplayer依赖,video_player已集成) - 修改控制器初始化代码:
import 'package:video_player/video_player.dart'; import 'package:exoplayer_android/src/exoplayer_android.dart'; @override void initState() { super.initState(); // 自定义Http数据源工厂,强制携带AccessKey Header final dataSourceFactory = DefaultHttpDataSourceFactory( 'flutter-video-player', // User-Agent标识 headers: {"AccessKey": CDN_READ_ONLY_TOKEN}, allowCrossProtocolRedirects: true, // 允许跨协议重定向,避免重定向时丢失Header ); // 创建媒体源 final mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(Uri.parse(widget.video))); // 从媒体源初始化控制器 controller = VideoPlayerController.fromMediaSource(mediaSource); controller.initialize(); }
额外排查方向
- 验证
CDN_READ_ONLY_TOKEN在Android端未被混淆或为空,可通过日志打印确认 - 检查Bunny CDN后台是否设置了IP白名单,确认Android设备IP在允许范围内
- 尝试将Header键改为全小写
accesskey测试,部分服务器对HTTP Header大小写敏感
内容的提问来源于stack exchange,提问作者Angela Riley
相关产品推荐
相关产品推荐

