facebook twitter hatena line email

「Android/VideoView/ダウンロード」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(サンプル)
 
(同じ利用者による、間の22版が非表示)
行1: 行1:
 +
==サンプル==
 +
事前ダウンロードして動画表示
 +
 +
VideoDownloaderConnection.java
 +
<pre>
 +
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 "";
 +
    }
 +
}
 +
</pre>
 +
 +
VideoDownloaderConnectionListener.java
 +
<pre>
 +
public interface VideoDownloaderConnectionListener
 +
{
 +
    void downloadSuccess();
 +
    void downloadFailed();
 +
}
 +
</pre>
 +
 +
===上記サンプルDLの使い方===
 +
<pre>
 +
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();
 +
</pre>
 +
 +
ストレージを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
 
https://blog.engineer.adways.net/entry/2016/09/03/010627
 +
 
Webview download/cache video
 
Webview download/cache video
 
https://stackoverflow.com/questions/23876103/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

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