在存储文件时,通常需要知道手机还有多少容量可以进行存储,下面列举了一些方法用来获取手机存储空间的大小:
1.判读SD卡是否可用

    /*** 判断sd卡是否可用*/public static boolean isExternalStorageAvailable() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);}

2.获取手机内部存储空间

/*** 获取手机内部存储空间* * @param context* @return 以M,G为单位的容量*/public static String getInternalMemorySize(Context context) {File file = Environment.getDataDirectory();StatFs statFs = new StatFs(file.getPath());long blockSizeLong = statFs.getBlockSizeLong();long blockCountLong = statFs.getBlockCountLong();long size = blockCountLong * blockSizeLong;return Formatter.formatFileSize(context, size);}

3.获取手机内部可用存储空间

/*** 获取手机内部可用存储空间* * @param context* @return 以M,G为单位的容量*/public static String getAvailableInternalMemorySize(Context context) {File file = Environment.getDataDirectory();StatFs statFs = new StatFs(file.getPath());long availableBlocksLong = statFs.getAvailableBlocksLong();long blockSizeLong = statFs.getBlockSizeLong();return Formatter.formatFileSize(context, availableBlocksLong* blockSizeLong);}

4.获取手机外部存储空间

    /*** 获取手机外部存储空间* * @param context* @return 以M,G为单位的容量*/public static String getExternalMemorySize(Context context) {File file = Environment.getExternalStorageDirectory();StatFs statFs = new StatFs(file.getPath());long blockSizeLong = statFs.getBlockSizeLong();long blockCountLong = statFs.getBlockCountLong();return Formatter.formatFileSize(context, blockCountLong * blockSizeLong);}

5.获取手机外部可用存储空间

/*** 获取手机外部可用存储空间* * @param context* @return 以M,G为单位的容量*/public static String getAvailableExternalMemorySize(Context context) {File file = Environment.getExternalStorageDirectory();StatFs statFs = new StatFs(file.getPath());long availableBlocksLong = statFs.getAvailableBlocksLong();long blockSizeLong = statFs.getBlockSizeLong();return Formatter.formatFileSize(context, availableBlocksLong* blockSizeLong);}

下面是程序运行结果:

先说一下我手机的基本情况,RAM是2G,ROM是8G,然后还插有16G的内存卡,但是程序运行结果怎么好像有问题啊,获取的不是SD的大小
首先,我们看看Environment.getDataDirectory()和Environment.getExternalStorageDirectory()分别获取的是哪个路径:

/*** 获取手机内部可用存储空间* * @param context* @return 以M,G为单位的容量*/public static String getAvailableInternalMemorySize(Context context) {File file = Environment.getDataDirectory();System.out.println("===========path "+file.getAbsolutePath());StatFs statFs = new StatFs(file.getPath());long availableBlocksLong = statFs.getAvailableBlocksLong();long blockSizeLong = statFs.getBlockSizeLong();return Formatter.formatFileSize(context, availableBlocksLong* blockSizeLong);}/*** 获取手机外部可用存储空间* * @param context* @return 以M,G为单位的容量*/public static String getAvailableExternalMemorySize(Context context) {File file = Environment.getExternalStorageDirectory();System.out.println("===========path2 "+file.getAbsolutePath());StatFs statFs = new StatFs(file.getPath());long availableBlocksLong = statFs.getAvailableBlocksLong();long blockSizeLong = statFs.getBlockSizeLong();return Formatter.formatFileSize(context, availableBlocksLong* blockSizeLong);}

打印结果是:

我们可以看到,内部存储空间获取的是/data目录,外部存储空间获取的是/storage/emulated/0目录,那个/data目录应该是没有问题的,然后我们去看看外部存储空间所指向的目录到底是不是SD卡所在的目录。
打开DDMS的File Explore,找到/storage/emulated/0目录:

我们可以看到这个目录其实是引用了另外一个目录,于是我们接着往下找

终于看到这个目录的全景了,到底是不是SD卡的文件结构呢,下面就打开手机,见证结果。

我们先点击内置存储,看看里面的目录结构:

可以看到,这个路径就是我们获取外部存储空间时的路径,所以说获取的外部存储空间大小根本不是SD卡的容量。
然后我们点击SD:

既然我们获取的外部存储空间不是SD卡这个路径,那我们去看看这个路径在哪里:

通过对比,我们在DDMS里面找到了路径,/storage/emulated/sdcard1,这个才是SD卡所在的路径。
结论:
搞了这么半天,我只是想告诉大家Environment.getExternalStorageDirectory()获取的不一定是SD卡的容量大小,那到底是为什么呢?在网上找了好久,有如下解释:
android手机获取自带存储路径和sd卡存储路径的方式是:调用Environment.getExternalStorageDirectory()。
1.一部分手机将eMMC存储挂载到/mnt/sdcard1 等节点,而将外置的SD卡挂载到 Environment.getExternalStorageDirectory()这个结点。
此时,调用Environment.getExternalStorageDirectory(),则返回外置的SD的路径。
2.而另一部分手机直接将eMMC存储挂载在Environment.getExternalStorageDirectory()这个节点,而将真正的外置SD卡挂载到/mnt/sdcard1 等节点。
此时,调用Environment.getExternalStorageDirectory(),则返回内置的SD的路径。
好了,这篇文章到此结束!

获取手机存储空间大小相关推荐

  1. Android杂谈---获取手机屏幕大小

    Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...

  2. android 常用机型尺寸_Android中获取手机屏幕大小的方法

    本文为大家解析Android中如何获取手机屏幕大小,提供一个解决方法,分享给大家供大家参考,具体内容如下 运行效果图: 运行程序后,当我们点击Button按钮时,可以看到下面的效果图: 具体代码: 我 ...

  3. Android 获取手机内存大小

    背景 项目中图片拍照功能是调用系统相机,由于某些手机内存不足,经常调用系统相机后,项目app进程被系统杀掉了,所以采取的措施是:调用系统相机前先判断手机可用内存大小,当可用内存低于500M时,提示用户 ...

  4. Android 获取手机存储空间

    1.获取可用的内存 public String getFreeMemory(){ActivityManager am = (ActivityManager) context.getSystemServ ...

  5. android应用获取手机存储空间方法

    获取手机内部空间和存储卡空间方法: public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundl ...

  6. 获取手机屏幕大小、密度、分辨率、状态栏、标题栏高度

    在开发手机应用时,除了对API的掌握外,更重要的还是画面. 对于画面,屏幕分辨率又是很重要的一个因素. 由于手机屏幕尺寸各不相同,在画面布局时就需要考虑这个问题. Android可以设置为随着窗口大小 ...

  7. Android中如何获取手机屏幕大小

    我们可以通过使用类DisplayMetrics来获取手机屏幕的分辨率大小.DisplayMetrics类是获取手机屏幕各种属性的关键类.下面通过例子来展示如何获取手机屏幕的分辨率. 在布局文件main ...

  8. android 检索空间,Android 获取手机存储空间

    1.获取可用的内存 public String getFreeMemory(){ ActivityManager am = (ActivityManager) context .getSystemSe ...

  9. 获取手机屏幕大小 DisplayMetrics

    方法1: //获取手机屏幕分辨率的类 private DisplayMetrics dm;dm = new DisplayMetrics(); getWindowManager().getDefaul ...

  10. Android 如何获取手机内存大小,内置存储空间大小

    直接上代码 package com.example.administrator.phoneinfo;import android.content.Context; import android.os. ...

最新文章

  1. 总结 20 个开发细节
  2. c#中如何跨线程调用windows窗体控件?
  3. P2924 [USACO08DEC]大栅栏Largest Fence
  4. 更改mssqlserver的表的编码格式_Excel格式全揭秘,赶紧收藏起来吧
  5. 【小题目】输入三个数字,获取三个数字中的最小值
  6. UVA - 514 Rails-栈
  7. C++ 类模板遇到继承的问题以及解决
  8. java instance变量_java 类方法和实例方法 以及 类变量和实例变量
  9. 用Java写有关早上的语录,实用的适合早上发的早安问候语语录汇编39句
  10. SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录
  11. IE6 透明遮挡falsh解决方案
  12. 2020年易语言调用大漠插件来制作游戏脚本教程
  13. PVE直通Intel核显虚拟机配置ffmpeg-qsv硬件加速
  14. 我的日程安排表(理解代码)学习记录Java
  15. 连线9宫格可实现手势密码等
  16. 【微信小程序】开发入门篇(一)
  17. Android Others部分内存泄漏 OOM分析
  18. 学士后java课程内容_java学士后详细课程
  19. 「python」抖音短视频下载助手
  20. 压缩包套压缩包的形式批量导出excel

热门文章

  1. 已删除的好友微信号怎么找回来
  2. python画图网格线设置_python – Matplotlib:更改单个网格线的颜色
  3. 使用 xrdp 远程桌面连接 RVBoards D1 哪吒开发板的桌面系统 lxde
  4. mysql straight join_MySQL基础之STRAIGHT JOIN用法简介
  5. 中国银行基金代销一览表
  6. 【洛谷】P2689 东南西北 c++
  7. OSPF网络可以没有BDR(实验)
  8. org.springframework.util.AntPathMatcher:URL 与 匹配规则
  9. 7.22版本服务器维护,7月22日服务器例行维护公告
  10. 俩 AI 约会遭全网围观:再厉害的算法,也逃不了翻车