我在android中有一个webview,去了一个有视频标签的网站。下载视频或缓存视频的最佳方式是什么,以便每次播放时都不会下载。找不到有效的东西。
答案 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
进行缓存。