Webview下载/缓存视频

时间:2014-05-26 18:49:34

标签: android caching video webview

我在android中有一个webview,去了一个有视频标签的网站。下载视频或缓存视频的最佳方式是什么,以便每次播放时都不会下载。找不到有效的东西。

3 个答案:

答案 0 :(得分:1)

首次加载视频时下载视频,并将其存储在应用的数据文件夹中。之后,在您的网页浏览中拦截视频网址请求,并从本地流式传输视频。

 @Override
 public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

//在这里检查是否/request.getUrl().toString()/是视频网址,如果是,那么

获取本地保存的视频并将其转换为输入流并返回如下,

return new WebResourceResponse(getMimeType(request.getUrl().toString()), "UTF-8", 200, "OK", responseHeaders, inputStream);   

答案 1 :(得分:0)

以下是使用Okhttp的示例。

在此示例中,它会下载一个文件,并向用户显示正在下载文件进度的进度条。

class VideoDownloader extends AsyncTask<Void, Long, Boolean> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(Void... params) {

        OkHttpClient client = new OkHttpClient();
        String url = "http://myamazingvideo.mp4";                        
        Call call = client.newCall(new Request.Builder().url(url).get().build());

        try {
            Response response = call.execute();
            if (response.code() == 200 || response.code() == 201) {

                Headers responseHeaders = response.headers();
                for (int i = 0; i < responseHeaders.size(); i++) {
                    Log.d(LOG_TAG, responseHeaders.name(i) + ": " + responseHeaders.value(i));
                }

                InputStream inputStream = null;
                try {
                    inputStream = response.body().byteStream();

                    byte[] buff = new byte[1024 * 4];
                    long downloaded = 0;
                    long target = response.body().contentLength();
                    mediaFile = new File(getActivity().getCacheDir(), "mySuperVideo.mp4");
                    OutputStream output = new FileOutputStream(mediaFile);

                    publishProgress(0L, target);
                    while (true) {
                        int readed = inputStream.read(buff);

                        if (readed == -1) {
                            break;
                        }
                        output.write(buff, 0, readed);
                        //write buff
                        downloaded += readed;
                        publishProgress(downloaded, target);
                        if (isCancelled()) {
                            return false;
                        }
                    }

                    output.flush();
                    output.close();

                    return downloaded == target;
                } catch (IOException ignore) {
                    return false;
                } finally {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                }
            } else {
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    protected void onProgressUpdate(Long... values) {
        super.onProgressUpdate(values);
        progressBar.setMax(values[1].intValue());
        progressBar.setProgress(values[0].intValue());

    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);

        progressBar.setVisibility(View.GONE);

        if (mediaFile != null && mediaFile.exists()) {
            playVideo();
        }
    }
}

答案 2 :(得分:0)

您可以在MediaPlayer的帮助下自行播放视频,并使用AndroidVideoCache进行缓存。