「Android/VideoView/ダウンロード」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→サンプル) |
|||
(同じ利用者による、間の2版が非表示) | |||
行15: | 行15: | ||
class VideoDownloaderConnection extends AsyncTask<Void, Long, Boolean> { | class VideoDownloaderConnection extends AsyncTask<Void, Long, Boolean> { | ||
private String TAG = "VideoDownloaderConnection"; | private String TAG = "VideoDownloaderConnection"; | ||
+ | private static final int MAX_VIDEO_SIZE = 25 * 1024 * 1024; // 25 MiB | ||
private Context mContext; | private Context mContext; | ||
− | String mUrl = ""; | + | private String mUrl = ""; |
− | VideoDownloaderConnectionListener mListener; | + | private VideoDownloaderConnectionListener mListener; |
public VideoDownloaderConnection(Context context) { | public VideoDownloaderConnection(Context context) { | ||
mContext = context; | mContext = context; | ||
行40: | 行41: | ||
HttpURLConnection huc = (HttpURLConnection)u.openConnection(); | HttpURLConnection huc = (HttpURLConnection)u.openConnection(); | ||
int size = huc.getContentLength(); | int size = huc.getContentLength(); | ||
+ | if (size > MAX_VIDEO_SIZE) { | ||
+ | log.debug_e(TAG, String.format( | ||
+ | "MediaDownloader encountered video larger than disk cap. " + | ||
+ | "(%d bytes / %d maximum).", | ||
+ | size, | ||
+ | MAX_VIDEO_SIZE)); | ||
+ | if (mListener != null) { | ||
+ | mListener.downloadFailed(); | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
if (huc != null) { | if (huc != null) { | ||
File f = new File(getStorageDirPath(), getStorageFileName()); | File f = new File(getStorageDirPath(), getStorageFileName()); | ||
行85: | 行97: | ||
} | } | ||
@Override | @Override | ||
− | protected void onPostExecute(Boolean | + | protected void onPostExecute(Boolean flag) { |
− | super.onPostExecute( | + | super.onPostExecute(flag); |
Log.i(TAG, "onPostExecute"); | Log.i(TAG, "onPostExecute"); | ||
− | if ( | + | if (flag) { |
if (mListener != null) { | if (mListener != null) { | ||
mListener.downloadSuccess(); | mListener.downloadSuccess(); |
2018年11月29日 (木) 16:43時点における最新版
サンプル
事前ダウンロードして動画表示
VideoDownloaderConnection.java
import android.content.Context; import android.os.AsyncTask; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.FileOutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; class VideoDownloaderConnection extends AsyncTask<Void, Long, Boolean> { private String TAG = "VideoDownloaderConnection"; private static final int MAX_VIDEO_SIZE = 25 * 1024 * 1024; // 25 MiB private Context mContext; private String mUrl = ""; private VideoDownloaderConnectionListener mListener; public VideoDownloaderConnection(Context context) { mContext = context; } public void setUrl(String url) { mUrl = url; } public void setListener(VideoDownloaderConnectionListener listener) { mListener = listener; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Boolean doInBackground(Void... params) { URL u = null; InputStream is = null; try { u = new URL(mUrl); is = u.openStream(); HttpURLConnection huc = (HttpURLConnection)u.openConnection(); int size = huc.getContentLength(); if (size > MAX_VIDEO_SIZE) { log.debug_e(TAG, String.format( "MediaDownloader encountered video larger than disk cap. " + "(%d bytes / %d maximum).", size, MAX_VIDEO_SIZE)); if (mListener != null) { mListener.downloadFailed(); } return false; } if (huc != null) { File f = new File(getStorageDirPath(), getStorageFileName()); FileOutputStream fos = new FileOutputStream(f); byte[] buffer = new byte[1024]; int len1 = 0; if (is != null) { while ((len1 = is.read(buffer)) > 0) { fos.write(buffer,0, len1); } } if (fos != null) { fos.close(); } } } catch (MalformedURLException mue) { mue.printStackTrace(); if (mListener != null) { mListener.downloadFailed(); return false; } } catch (IOException ioe) { ioe.printStackTrace(); if (mListener != null) { mListener.downloadFailed(); return false; } } finally { try { if (is != null) { is.close(); } } catch (IOException ioe) { if (mListener != null) { mListener.downloadFailed(); return false; } } } return true; } @Override protected void onProgressUpdate(Long... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(Boolean flag) { super.onPostExecute(flag); Log.i(TAG, "onPostExecute"); if (flag) { if (mListener != null) { mListener.downloadSuccess(); } } } private String getStorageFileName() { return md5(mUrl) + ".mp4"; } public String getStorageFilePath() { return getStorageDirPath() + "/" + getStorageFileName(); } private String getStorageDirPath() { return mContext.getExternalCacheDir().toString(); } private static String md5(String s) { try { MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(s.getBytes()); byte messageDigest[] = digest.digest(); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < messageDigest.length; i++) { String h = Integer.toHexString(0xFF & messageDigest[i]); while (h.length() < 2) h = "0" + h; hexString.append(h); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } }
VideoDownloaderConnectionListener.java
public interface VideoDownloaderConnectionListener { void downloadSuccess(); void downloadFailed(); }
上記サンプルDLの使い方
private VideoDownloaderConnectionListener mediaDownloaderLisener = new VideoDownloaderConnectionListener() { public void downloadSuccess() { } public void downloadFailed() { } }; VideoDownloaderConnection connection = new VideoDownloaderConnection(MainActivity.this.getApplicationContext()); connection.setUrl("~.mp4"); connection.setListener(mediaDownloaderLisener); connection.execute();
ストレージをcachedirとしているがいろいろ変更できる
return mContext.getExternalCacheDir().toString(); // cachedir return Environment.getExternalStorageDirectory().toString(); // sdcard
参考:http://blog.lciel.jp/blog/2014/02/08/android-about-storage/
上記DLしたmp4のvideoViewでの再生
VideoDownloaderConnection downloader = new VideoDownloaderConnection(context); downloader.setUrl("ttps://hogehoge.com/hoge.mp4"); File file = new File(downloader.getStorageFilePath()); if (file.exists()) { mVideoView.setVideoPath(path); }
参考
動画のダウンロード https://blog.engineer.adways.net/entry/2016/09/03/010627
Webview download/cache video https://stackoverflow.com/questions/23876103/webview-download-cache-video
YoutubeDownloadMp4 https://stackoverflow.com/questions/7203047/code-for-download-video-from-youtube-on-java-android