【发布时间】:2014-07-15 13:55:33
【问题描述】:
我在 android 中有一个 webview,可以访问其中包含视频标签的网站。下载视频或缓存它的最佳方法是什么,这样它就不会在每次播放时都下载。找不到任何有效的东西。
【问题讨论】:
标签: android caching video webview
我在 android 中有一个 webview,可以访问其中包含视频标签的网站。下载视频或缓存它的最佳方法是什么,这样它就不会在每次播放时都下载。找不到任何有效的东西。
【问题讨论】:
标签: android caching video webview
在您第一次加载视频时下载视频,并将其存储在您应用的数据文件夹中。之后在您的 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);
【讨论】:
这是一个使用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有什么关系?
您可以在MediaPlayer 的帮助下自己播放视频,并使用AndroidVideoCache 进行缓存。
【讨论】: