Android 获取创建各种存储路径工具类(内置权限获取)
2016-08-18 17:39
573 查看
前言
最近工作比较轻,从项目中总结抽象出一些工具类,利人利己,欢迎交流完善~概念介绍
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; } }
相关文章推荐
- Android获取手机内置外置存储文件列表,完美解决各种rom各种系统版本的获取方式不用的问题
- Android获取内置、外置以及OTG等方式挂载的存储设备路径
- Android 获取本地存储路径的各种方法详解
- Android获取机身存储、内置SD卡与外置TF卡路径
- Android开发获取多个存储空间的路径(内置SD卡以及外置SD卡)
- Android 通过反射调用获取内置存储和外置sd卡根路径(适用于各个版本)
- android 获取路径目录方法以及判断目录是否存在,创建目录
- android 获取 内外存储设备路径疑问
- android 获取路径目录方法以及判断目录是否存在,创建目录
- android 获取 内外存储设备路径疑问
- 获取android的各种路径
- Android下获取各种存储目录
- android 获取路径目录方法以及判断目录是否存在,创建目录
- android 获取路径目录方法以及判断目录是否存在,创建目录
- Android 最新获取手机内置存储大小,SD卡存储空间大小方法
- Android下获取各种存储目录
- android的Environment类,获取各种目录路径
- Android 获取内存卡路径及外存储路径方法
- android获取相机默认存储路径的最后一张照片
- Android 获取SD路径,存储空间大小的方法