风儿带你了解Android存储路径。

前言:

你对手机存储到底了解多少?从安卓4.4以后在外置内存卡中有没有存储过东西。先上两张图片。
第一张图片是酷我音乐下载设置的选项:


酷我下载截图

第二张是网易云音乐下载设置的选项:

网易云下载截图

从上面两张图可以看到外置卡的名字都是/storage/9016-4EF8那么这个路径是怎么拿到的呢?

任务:明白获取到外置的存储路径。

我们只是讲扩展卡内存,手机的外部存储又分为SD卡和扩展卡内存,目前安卓旗舰手机的SD卡内存为128G,但是好多手机还是可以安装扩展卡,大部分是在卡槽的地方。
想要获取上面的路径,我们可以用反射:

   public static String getExtendedMemoryPath(Context mContext) {
        StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
        Class<?> storageVolumeClazz = null;
        try {
            storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
            Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
            Method getPath = storageVolumeClazz.getMethod("getPath");
            Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
            Object result = getVolumeList.invoke(mStorageManager);
            final int length = Array.getLength(result);
            for (int i = 0; i < length; i++) {
                Object storageVolumeElement = Array.get(result, i);
                String path = (String) getPath.invoke(storageVolumeElement);
                boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
                if (removable) {
                    return path;
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

上面的代码就可以找到上面的路径。

新的问题怎样知道外置内存卡的大小呢?可用内存呢?还是上代码

 /**
     * 根据路径获取内存状态
     *
     * @param path
     * @return
     */
    private String getMemoryInfo(File path) {
        // 获得一个磁盘状态对象
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();   // 获得一个扇区的大小
        long totalBlocks = stat.getBlockCount();    // 获得扇区的总数
        long availableBlocks = stat.getAvailableBlocks();   // 获得可用的扇区数量
        // 总空间
        String totalMemory = Formatter.formatFileSize(this, totalBlocks * blockSize);
        // 可用空间
        String availableMemory = Formatter.formatFileSize(this, availableBlocks * blockSize);
        return "总空间: " + totalMemory + "可用空间: " + availableMemory;
    }

这样就轻松地看到外置存储卡的存储路径以及外置卡的大小。

怎样存储到外部呢?

我们看到上面的图存储路径低有规律的/storage/9016-4EF8/Android/data/包名/都是这个开头的。我们来验证一下能不能存入。打开手机文件夹/Android/data/目录,发现没有我们需要的包名的文件夹。根据大多数人的习惯一定会执行下面的代码:

 /**
     * 根据文件路径 递归创建文件
     *
     * @param file
     */
    public static void createDipPath(String file) {
        String parentFile = file.substring(0, file.lastIndexOf("/"));
        File file1 = new File(file);
        File parent = new File(parentFile);
        if (!file1.exists()) {
            parent.mkdirs();
            try {
                file1.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

但是当执行到parent.mkdirs();这行代码时,返回的是false,就是没有成功。我们就手动建一个自己包名的文件夹吧!先验证能不能不能存入:自己建立一个工程包名的文件夹,存入一个简单的action.txt文件发现是可以的。那么问题来了总不能让用户自己去新建一个文件夹吧。问题还是有解决办法的。

context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)

判断一下,我们工程包名的文件夹是否存在,如果不存在就可以执行上面的代码,就会新建工程包名文件夹。

问题:那么安卓4.3及以下的版本呢??

上面的方法好使么?试试就知道!!!现在就要处理挂在的问题了。再4.3~4.0之间的版本大部分都是可以在加入一张位置SD卡的。手机也会有4G或者是8G的自带扩展存储。那么问题来了。这两个怎么区分???
1.外置SD卡是否挂载和路径地址:外置sd卡是否挂载

  public static boolean isSDCardMounted() {
        return android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED);
    }

外置SD卡的路径:

//外置sd卡路径
String sdcardPath = System.getenv("EXTERNAL_STORAGE");
//外置sd卡路径
String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();

先判断是否挂载SD卡。如果SD卡存在才能使用外置SD卡。
2.手机自带的扩展存储:路径:

//手机自带的扩展存储路径
String extSdcardPath = System.getenv("SECONDARY_STORAGE");

这样就基本可以兼容4.0以上的安卓版本了。

注意:只是测试了部分手机。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。在进行视频的下载时,我们经常会面临存储路径的选择,选择一个好的...
    Corrine_Shao阅读 4,330评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,872评论 25 707
  • 在了解存储路径之前,先来看看Android QQ的文件管理界面,了解一下QQ的数据文件路径来源,到底是来源于什么地...
    大白栈阅读 59,171评论 3 82
  • 在了解存储路径之前,先来看看Android QQ的文件管理界面,了解一下QQ的数据文件路径来源,到底是来源于什么地...
    格老子阅读 1,751评论 0 4
  • 书不能单读。康德累了读都德,都德累了读歌德,歌德累了可以读王尔德。也想一鼓作气的看完一本书过,可惜,酣畅淋...
    子掀阅读 213评论 0 1