在整天没有找到解决方案后,我在SO上试一试:
场景:客户端可以登录和访问视频文件。我使用PHP伪流(字节范围请求)提供视频文件。视频文件位于受保护的文件夹中。
设定:
loading.php 提供html5视频嵌入代码:
<video ...> <source src="videoprovider.php?secure=CODE" type="video/webm"> </video>
videoprovider.php 让代码找到合适的视频并以字节范围返回视频
两个PHP文件都会检查客户端是否已登录。为此,我在每个文件的开头使用modx:
require_once DOCUMENT_ROOT.'modx/includes/config.inc.php';
startCMSSession(); // does session_start()
然后我可以访问登录时设置的$ _SESSION数据。
一切都适用于桌面,但不适用于Android设备。 Android设备仅显示视频加载指示符并被卡住。
我打印了$ _SESSION,发现只要Android尝试播放视频文件(几个范围字节请求),第一个请求就会说$ _SESSION就在那里,第二个请求说再没有$ _SESSION了。
我无法进一步追踪错误。什么是Android的问题?为什么它可以阅读会话,然后不再阅读。
一些注释:
我已经正确链接了所有文件,没有404会破坏会话(至少不会在Web开发人员控制台中,不要看 Android正在做什么)。
调用startCMSSession();多次,对于每个视频范围请求,不应改变会话。
适用于所有桌面浏览器。
更新
问题是,浏览器本身并不发送音频标签请求,而是将其委托给stagefright。可悲的是,Stagefright(在Android 2.3上)根本不发送任何cookie ...
那么如何解决这个问题? (我的测试设备是Android 4。)