Android项目数据存储路径小结

Android项目数据存储路径选择

在网上看过一个例子 :

中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD
Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro SD
Card),但是机身自带了一个内置存储卡(也就是eMMC存储,大小为2G)。

我把这个手机用数据线插到电脑上,也会看到盘符,通过安装「R.E
管理器」等文件管理应用,也可以管理文件,并且能看到该存储的挂载目录是:/mnt/sdcard2

但是,

我打印 Environment.getExternalStorageState(),却返回 ”removed“;

这是怎么回事?明明手机本身带着内置SD卡,却为何提示这么一个信息?

我又试着去打印了Environment.getExternalStorageDirectory(),返回:“/mnt/sdcard”

看起来可以解释了,在我这个中兴手机上,调用Environment.getExternalStorageDirectory(),返回的存储目录并不是系统内置的SD卡目录。

我又换了一个 Sony L39u,一个 MOTO
G,调用Environment.getExternalStorageDirectory()返回的目录就是系统内置的SD卡目录。

不同的设备上,调用getExternalStorageDirectory()返回值却不一样。查询了Android的文档,才找到原因,原来这个方法返回的是当前设备厂商所认为的“外部存储”,有可能返回外置的SD卡目录(Micro
SD Card),也可能返回内置的存储目(eMMC)。

总结一下:

一部分手机将eMMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到
Environment.getExternalStorageDirectory()这个结点。
此时,调用Environment.getExternalStorageDirectory(),则返回外置的SD的路径。

而另一部分手机直接将eMMC存储挂载在Environment.getExternalStorageDirectory()这个节点,而将真正的外置SD卡挂载到/mnt/external_sd、/mnt/sdcard2
等节点。 此时,调用Environment.getExternalStorageDirectory(),则返回内置的SD的路径。

至此就能解释为都是无外置SD卡的情况下,在中兴手机上,调用

打印 Environment.getExternalStorageState(),却返回 ”removed“,在索尼、MOTO
G上就返回:“mounted”
From http://m.oschina.net/blog/288183

个人使用心得:

项目经常会往手机本地内存中存储东西,对于手机SD位置,不同的设备厂商默认的SD卡挂载节点不一致
开发中经常会出现错误,为防止上述情况发生,提供一种解决方式:

当使用getExternalStorageDirectory()获得的存储卡状态为MOUNTED时,

当设备状态为REMOVE时

**当使用getExternalStorageDirectory()获得的存储卡状态为MOUNTED时,使用该条件下获取的目录+自定义目录
当设备状态为REMOVE时,使用getCacheDir()+自定义目录格式存储**
    /** * 获取储存Image的目录 * @return */
    private String getStorageDirectory(){
    return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ?
Environment.getExternalStorageDirectory() + FOLDER_NAME :  context.getCacheDir().getPath() + FOLDER_NAME;
    }

优化代码,精简一下便于观察


    /** * 存储图片的目录 */
    private static File mSavePath = Environment.getExternalStorageDirectory();
    /** * 手机的缓存根目录 */
    private static String mDataRootPath = null;
    /** * 保存Image的目录名 */
    private final static String FOLDER_NAME = "/imsiper";


    public FileUtils(Context context){
        mDataRootPath = context.getCacheDir().getPath();
    }


    /** * 获取储存Image的目录 * @return */
    private String getStorageDirectory(){
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ?
                mSavePath + FOLDER_NAME : mDataRootPath + FOLDER_NAME;
    }

over,日常笔记,希望多多指教。

你可能感兴趣的:(Android项目数据存储路径小结)