Android 获取创建各种存储路径工具类(内置权限获取)

前言

最近工作比较轻,从项目中总结抽象出一些工具类,利人利己,欢迎交流完善~


概念介绍

1、内部存储 Internal Storage:

注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的内部存储一般用Context来获取和操作

getFilesDir()获取你app的内部存储空间,相当于你的应用在内部存储上的根目录。


2、外部存储 External Storage

所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了”内部internal” 和”外部external” 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。最重要的是,无论手机机身存储多大,都会被API看做为外部的存储,只有少部分空间被分为内部存储


用法

核心用法如下,获取所需要的path,注意创建文件夹时注意判断是否存在和用try/catch包裹。

        Log.i(TAG, "getCacheDirectory: "+ StorageUtils.getCacheDirectory(this));
        Log.i(TAG, "getCacheDirectory true: "+ StorageUtils.getCacheDirectory(this,true));
        Log.i(TAG, "getCacheDirectory false: "+ StorageUtils.getCacheDirectory(this,false));
        Log.i(TAG, "getIndividualCacheDirectory:"+StorageUtils.getIndividualCacheDirectory(this));
        Log.i(TAG, "getOwnCacheDirectory:"+StorageUtils.getOwnCacheDirectory(this,"/JayGoo"));

        String path=StorageUtils.getCacheDirectory(this).toString();
        File fileDir=new File(path);
        if(!fileDir.exists()){
            try {
                fileDir.mkdirs();
            }catch (Exception e){
                e.printStackTrace();
            }

        }

运行结果:

08-18 17:08:41.333 25041-25041/? I/jinjie: getCacheDirectory: /storage/emulated/0/Android/data/com.example.google_acmer.asimplecachedemo/cache
08-18 17:08:41.343 25041-25041/? I/jinjie: getCacheDirectory true: /storage/emulated/0/Android/data/com.example.google_acmer.asimplecachedemo/cache
08-18 17:08:41.343 25041-25041/? I/jinjie: getCacheDirectory false: /data/user/0/com.example.google_acmer.asimplecachedemo/cache
08-18 17:08:41.353 25041-25041/? I/jinjie: getIndividualCacheDirectory:/storage/emulated/0/Android/data/com.example.google_acmer.asimplecachedemo/cache/uil-images
08-18 17:08:41.363 25041-25041/? I/jinjie: getOwnCacheDirectory:/storage/emulated/0/JayGoo

源码

package com.example.google_acmer.asimplecachedemo.Utils;

import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.IOException;

import static android.os.Environment.MEDIA_MOUNTED;

/**
 * @author Sergey Tarasevich (nostra13[at]gmail[dot]com)
 * @created : JayGoo
 * @Description: Provides application storage paths
 * 
 * Methods get storage path samples:
 * 
 * getCacheDirectory: /storage/emulated/0/Android/data/com.example.google_acmer.asimplecachedemo/cache
 * getCacheDirectory true: /storage/emulated/0/Android/data/com.example.google_acmer.asimplecachedemo/cache
 * getCacheDirectory false: /data/user/0/com.example.google_acmer.asimplecachedemo/cache
 * getIndividualCacheDirectory:/storage/emulated/0/Android/data/com.example.google_acmer.asimplecachedemo/cache/uil-images
 * getOwnCacheDirectory:/storage/emulated/0/JayGoo
 */
public final class StorageUtils {

    private static final String EXTERNAL_STORAGE_PERMISSION = "android.permission.WRITE_EXTERNAL_STORAGE";
    private static final String INDIVIDUAL_DIR_NAME = "uil-images";
    private static final String TAG = "StorageUtils";

    private StorageUtils() {
    }

    /**
     * Returns application cache directory. Cache directory will be created on SD card
     * <i>("/Android/data/[app_package_name]/cache")</i> if card is mounted and app has appropriate permission. Else -
     * Android defines cache directory on device's file system.
     *
     * @param context Application context
     * @return Cache {@link File directory}.<br />
     * <b>NOTE:</b> Can be null in some unpredictable cases (if SD card is unmounted and
     * {@link android.content.Context#getCacheDir() Context.getCacheDir()} returns null).
     */
    public static File getCacheDirectory(Context context) {
        return getCacheDirectory(context, true);
    }

    /**
     * Returns application cache directory. Cache directory will be created on SD card
     * <i>("/Android/data/[app_package_name]/cache")</i> (if card is mounted and app has appropriate permission) or
     * on device's file system depending incoming parameters.
     *
     * @param context        Application context
     * @param preferExternal Whether prefer external location for cache
     * @return Cache {@link File directory}.<br />
     * <b>NOTE:</b> Can be null in some unpredictable cases (if SD card is unmounted and
     * {@link android.content.Context#getCacheDir() Context.getCacheDir()} returns null).
     */
    public static File getCacheDirectory(Context context, boolean preferExternal) {
        File appCacheDir = null;
        String externalStorageState;
        try {
            externalStorageState = Environment.getExternalStorageState();
        } catch (NullPointerException e) { // (sh)it happens (Issue #660)
            externalStorageState = "";
        }
        if (preferExternal && MEDIA_MOUNTED.equals(externalStorageState) && hasExternalStoragePermission(context)) {
            appCacheDir = getExternalCacheDir(context);
        }
        if (appCacheDir == null) {
            appCacheDir = context.getCacheDir();
        }
        if (appCacheDir == null) {
            String cacheDirPath = "/data/data/" + context.getPackageName() + "/cache/";
            Log.d(TAG, "Can't define system cache directory! " + cacheDirPath + " will be used.");
            appCacheDir = new File(cacheDirPath);
        }
        return appCacheDir;
    }

    /**
     * Returns individual application cache directory (for only image caching from ImageLoader). Cache directory will be
     * created on SD card <i>("/Android/data/[app_package_name]/cache/uil-images")</i> if card is mounted and app has
     * appropriate permission. Else - Android defines cache directory on device's file system.
     *
     * @param context Application context
     * @return Cache {@link File directory}
     */
    public static File getIndividualCacheDirectory(Context context) {
        File cacheDir = getCacheDirectory(context);
        File individualCacheDir = new File(cacheDir, INDIVIDUAL_DIR_NAME);
        if (!individualCacheDir.exists()) {
            if (!individualCacheDir.mkdir()) {
                individualCacheDir = cacheDir;
            }
        }
        return individualCacheDir;
    }

    /**
     * Returns specified application cache directory. Cache directory will be created on SD card by defined path if card
     * is mounted and app has appropriate permission. Else - Android defines cache directory on device's file system.
     *
     * @param context  Application context
     * @param cacheDir Cache directory path (e.g.: "AppCacheDir", "AppDir/cache/images")
     * @return Cache {@link File directory}
     */
    public static File getOwnCacheDirectory(Context context, String cacheDir) {
        File appCacheDir = null;
        if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) && hasExternalStoragePermission(context)) {
            appCacheDir = new File(Environment.getExternalStorageDirectory(), cacheDir);
        }
        if (appCacheDir == null || (!appCacheDir.exists() && !appCacheDir.mkdirs())) {
            appCacheDir = context.getCacheDir();
        }
        return appCacheDir;
    }

    private static File getExternalCacheDir(Context context) {
        File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data");
        File appCacheDir = new File(new File(dataDir, context.getPackageName()), "cache");
        if (!appCacheDir.exists()) {
            if (!appCacheDir.mkdirs()) {
                Log.d(TAG, "Unable to create external cache directory");
                return null;
            }
            try {
                new File(appCacheDir, ".nomedia").createNewFile();
            } catch (IOException e) {
                Log.d(TAG, "Can't create \".nomedia\" file in application external cache directory");
            }
        }
        return appCacheDir;
    }

    private static boolean hasExternalStoragePermission(Context context) {
        int perm = context.checkCallingOrSelfPermission(EXTERNAL_STORAGE_PERMISSION);
        return perm == PackageManager.PERMISSION_GRANTED;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值