Android如何播放受OAuth2保护端点的音视频流?需请求头带access-token
Android播放带自定义请求头的受保护媒体文件方案
Android系统完全支持该需求,常用的可行方案如下:
方案1:使用原生API自带的请求头重载方法(无需额外依赖,适配API 14+)
原生MediaPlayer和VideoView都提供了带请求头参数的重载方法,直接传入封装好的access-token头即可:
// 音频播放示例 Map<String, String> headers = new HashMap<>(); headers.put("access-token", "你的OAuth2 accessToken值"); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // 调用带headers参数的setDataSource重载 mediaPlayer.setDataSource(context, Uri.parse(媒体资源URL), headers); mediaPlayer.prepareAsync(); // 推荐异步prepare避免阻塞主线程 mediaPlayer.setOnPreparedListener(MediaPlayer::start);
// 视频播放示例 Map<String, String> headers = new HashMap<>(); headers.put("access-token", "你的OAuth2 accessToken值"); videoView.setVideoURI(Uri.parse(媒体资源URL), headers); videoView.setOnPreparedListener(mp -> videoView.start());
注意:该方法在绝大多数Android 4.0以上系统可正常使用,少数第三方定制ROM如果出现兼容问题,可切换下面的方案
方案2:使用ExoPlayer(谷歌官方推荐,适配性更强)
ExoPlayer是谷歌推出的替代原生播放器的开源实现,天生支持自定义请求配置,灵活度更高,是目前行业主流方案:
// 构建带自定义请求头的数据源工厂 DefaultHttpDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory() .setDefaultRequestProperties(Map.of("access-token", "你的OAuth2 accessToken值")); // 构建播放器实例 ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); // 绑定播放视图(音频播放可跳过该步骤) player.setPlayerView(playerView); // 加载媒体资源 player.setMediaItem(MediaItem.fromUri(媒体资源URL)); player.prepare(); player.play();
注意:ExoPlayer最低支持Android API 16,支持自定义缓存、重试逻辑、多种编码格式,适配性远高于原生播放器
方案3:本地反向代理中转(适配极端兼容场景)
如果前两个方案在特殊设备上存在兼容问题,可以通过本地轻量HTTP代理中转实现:
- 本地启动一个监听127.0.0.1端口的轻量HTTP服务(可基于NanoHTTPD等轻量框架实现)
- 播放器请求地址改为本地代理地址,比如
http://127.0.0.1:本地端口/资源路径 - 代理服务收到播放器请求后,自动添加access-token请求头转发到真实服务端,将服务端返回的媒体流数据回传给播放器即可
内容的提问来源于stack exchange,提问作者SSP
相关产品推荐
相关产品推荐

