1.遇到的问题
Webview 做预加载,提前缓存MP4文件到本地。网络加载的时候拦截返回本地资源。 一般做法都是 在 shouldInterceptRequest 方法中做
AssetManager manager = getResources().getAssets();
InputStream is = manager.open("xxx.mp4");
WrapInputStream wrapInputStream = new WrapInputStream(is);
String extension = MimeTypeMap.getFileExtensionFromUrl(url.toLowerCase());
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
WebResourceResponse resourceResponse = new WebResourceResponse(mimeType,
"", wrapInputStream);
........
return resourceResponse;
这么做现在播放没有问题。但发现视频不能seek了。而且也没有了缓存进度条。 发现 shouldInterceptRequest 有个 WebResourceRequest request 对象
Map<String, String> heads = request.getRequestHeaders();
获得请求头,打印出来
User-Agent:Mozilla/5.0
Accept-Encoding:identity;q=1, *;q=0
Range:bytes=0-
Accept:value=*/*
可以看出来是断点续传。 解析出来bytes
private int getBytes(String value) {
int index = value.indexOf("bytes=");
String bytesstr = value.substring(index + 6);
index = bytesstr.indexOf("-");
bytesstr = bytesstr.substring(0, index);
int bytes = 0;
try {
bytes = Integer.parseInt(bytesstr);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return bytes;
}
根据bytes 放回 head信息
String contentRange = "bytes " + bytes + "-" + (available - 1) + "/" + available;
header.put("Content-Range", contentRange);
还得把HttpCode 设为206
resourceResponse.setStatusCodeAndReasonPhrase(206, "Partial Content");
然后就能seek了