Android WebView 拦截MP4

886 阅读1分钟

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了