【问题标题】:Webview download/cache videoWebview 下载/缓存视频
【发布时间】:2014-07-15 13:55:33
【问题描述】:

我在 android 中有一个 webview,可以访问其中包含视频标签的网站。下载视频或缓存它的最佳方法是什么,这样它就不会在每次播放时都下载。找不到任何有效的东西。

【问题讨论】:

    标签: android caching video webview


    【解决方案1】:

    在您第一次加载视频时下载视频,并将其存储在您应用的数据文件夹中。之后在您的 webview 中拦截视频 url 请求并从本地流式传输视频。

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

    //这里检查/request.getUrl().toString()/是否为视频url,如果是,则

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

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

    【讨论】:

      【解决方案2】:

      这是一个使用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();
              }
          }
      }
      

      【讨论】:

      • 这和WebView有什么关系?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多