package vandy.mooc.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.io.IOUtils; import retrofit.client.Response; import android.content.Context; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Environment; /** * Helper class that contains methods to store and get Video * from Android Local Storage. */ public class VideoStorageUtils { /** * Stores the Video in External Downloads directory in Android. */ public static File storeVideoInExternalDirectory(Context context, Response response, String videoName) { // Try to get the File from the Directory where the Video // is to be stored. final File file = getVideoStorageDir(videoName); if (file != null) { try { // Get the InputStream from the Response. final InputStream inputStream = response.getBody().in(); // Get the OutputStream to the file // where Video data is to be written. final OutputStream outputStream = new FileOutputStream(file); // Write the Video data to the File. IOUtils.copy(inputStream, outputStream); // Close the streams to free the Resources used by the // stream. outputStream.close(); inputStream.close(); // Always notify the MediaScanners after Downloading // the Video, so that it is immediately available to // the user. notifyMediaScanners(context, file); return file; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * Notifies the MediaScanners after Downloading the Video, so it * is immediately available to the user. */ private static void notifyMediaScanners(Context context, File videoFile) { // Tell the media scanner about the new file so that it is // immediately available to the user. MediaScannerConnection.scanFile (context, new String[] { videoFile.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { } }); } /** * Checks if external storage is available for read and write. * * @return True-If the external storage is writable. */ private static boolean isExternalStorageWritable() { return Environment.MEDIA_MOUNTED.equals (Environment.getExternalStorageState()); } /** * Get the External Downloads Directory to * store the Videos. * * @param videoName */ private static File getVideoStorageDir(String videoName) { //Check to see if external SDCard is mounted or not. if (isExternalStorageWritable()) { // Create a path where we will place our video in the // user's public Downloads directory. Note that you should be // careful about what you place here, since the user often // manages these files. final File path = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS); final File file = new File(path, videoName); // Make sure the Downloads directory exists. path.mkdirs(); return file; } else { return null; } } /** * Make VideoStorageUtils a utility class by preventing instantiation. */ private VideoStorageUtils() { throw new AssertionError(); } }