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

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被正确携带:

  1. 确保依赖最新版video_player(无需额外添加exoplayer依赖,video_player已集成)
  2. 修改控制器初始化代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:57:46