get File From External Cache - Android App

Android examples for App:Cache

Description

get File From External Cache

Demo Code

/*//w  ww. j  a v  a  2  s  .c om
 * Copyright (C) 2011 Catch.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 * 
 * Harry Tormey <harry@catch.com> Modified by Omar Pera <omar@androidsx.com>
 */
//package com.book2s;
import java.io.File;
import java.io.IOException;
import android.content.Context;
import android.os.Environment;

import android.util.Log;

public class Main {
    private static final String NOMEDIA_FILENAME = ".nomedia";
    private static final String TAG = "FileCacheUtil";

    public static File getFileFromExternalCache(Context context,
            String fileName) {
        if (isSdCardAvailable()) {
            File extCacheDir = getExternalCacheDir(context);
            return getFileFromCache(context, fileName, extCacheDir);
        } else {
            Log.w(TAG, "Sdcard not available while retrieving " + fileName);
            return null;
        }
    }

    /**
     * Returns whether the SD card is available
     */
    public static boolean isSdCardAvailable() {
        String externalStorage = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(externalStorage)
                || Environment.MEDIA_MOUNTED_READ_ONLY
                        .equals(externalStorage)) {
            return true;
        }
        return false;
    }

    public static File getExternalCacheDir(Context context) {
        return getExternalStorageDir(context, "/cache");
    }

    private static File getFileFromCache(Context context, String fileName,
            File cacheDir) {
        if (cacheDir != null) {
            File cachedFile = new File(cacheDir, fileName);
            if (cachedFile != null && cachedFile.exists()) {
                return cachedFile;
            }
        }
        return null;
    }

    /** We are supposed to check before this method if the sdcard is available */
    private static File getExternalStorageDir(Context context, String dir) {
        if (dir != null) {
            File extMediaDir = new File(
                    Environment.getExternalStorageDirectory()
                            + "/Android/data/" + context.getPackageName()
                            + dir);

            if (extMediaDir.exists()) {
                createNomediaDotFile(context, extMediaDir);
                return extMediaDir;
            }

            if (isSdCardWritable()) {
                extMediaDir.mkdirs();
                createNomediaDotFile(context, extMediaDir);
                return extMediaDir;
            } else {
                Log.e(TAG,
                        "SD card not writeable, unable to create directory: "
                                + extMediaDir.getPath());
            }
        }
        return null;
    }

    private static void createNomediaDotFile(Context context, File directory) {
        if (directory != null && isSdCardWritable()) {
            File nomedia = new File(directory, NOMEDIA_FILENAME);

            if (nomedia != null && !nomedia.exists()) {
                try {
                    nomedia.mkdirs();
                    nomedia.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e(TAG, "unable to create .nomedia file in "
                            + directory.getPath(), e);
                }
            }
        }
    }

    /**
     * Returns whether the SD card is available and writable
     */
    public static boolean isSdCardWritable() {
        return Environment.MEDIA_MOUNTED.equals(Environment
                .getExternalStorageState());
    }
}

Related Tutorials