当前位置: 首页 > 编程笔记 >

Android之获取手机内部及sdcard存储空间的方法

长孙泉
2023-03-14
本文向大家介绍Android之获取手机内部及sdcard存储空间的方法,包括了Android之获取手机内部及sdcard存储空间的方法的使用技巧和注意事项,需要的朋友参考一下

知识点:

内部存储空间获取总大小和可用大小;

sdcard存储空间获取总大小和可用大小;

新名词记录{StatFs:描述文件系统信息的类}

概览

在开发中,我们或多或少都会用到存储空间进行存储数据。移动设备上可以有两种的存储方式:手机内部空间和sdcard外部空间。对于要使用存储空间,要使用哪一个?如何判断是否有足够的空间?sdcard是否挂载?等等诸多问题就来了。

对于设备内部存储空间来说,是一定会存在的。如果使用内部存储空间,我们需要做的是判断内部存储空间是否有足够大的可用空间给我们使用。现在的移动设备,手机厂商已经将内部存储做得很大很大了,一般来说用户都足够用了。

对于sdcard,这个是用户外部选择性的进行存储空间扩展的,事实上不一定会有sdcard。尤其是在现在Android移动设备厂商提供的内部存储空间越来越大,起步的已经都是32G了,更大的可以去到128G,所以用户可能就不需要再进行sdcard的扩展了。但是,设备内部存储空间小,需要用到外部存储空间的情况还是可能会出现的。而且可以知道主流的APP对于一些非私密的数据,例如图片,歌曲以及下载的更新包等,都会选择放置在sdcard里,以减少占用内部存储空间。

说了这么多,我们还是有必要对上面两种存储空间的使用作一个说明,如何获取存储空间是否可用,可用空间是否足够大等问题。

内部存储空间

我们知道,存储硬件的空间是按着区块来划分的,每个区块有固定的大小。存储设备的总大小=区块大小*区块数量。通过StatFs类,我们可以获取到总的区块,可用区块和每个区块的字节大小等信息。

具体看代码:

/**
   * 获取手机内部空间总大小
   *
   * @return 大小,字节为单位
   */
  static public long getTotalInternalMemorySize() {
    //获取内部存储根目录
    File path = Environment.getDataDirectory();
    //系统的空间描述类
    StatFs stat = new StatFs(path.getPath());
    //每个区块占字节数
    long blockSize = stat.getBlockSize();
    //区块总数
    long totalBlocks = stat.getBlockCount();
    return totalBlocks * blockSize;
  }

  /**
   * 获取手机内部可用空间大小
   *
   * @return 大小,字节为单位
   */
  static public long getAvailableInternalMemorySize() {
    File path = Environment.getDataDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSize();
    //获取可用区块数量
    long availableBlocks = stat.getAvailableBlocks();
    return availableBlocks * blockSize;
  }

用以上两个方法,就可以获得内部存储空间总大小和可用大小了。

sdcard外部存储空间

  /**
   * 判断SD卡是否可用
   *
   * @return true : 可用<br>false : 不可用
   */
  public static boolean isSDCardEnable() {
    return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
  }

/**
   * 获取手机外部总空间大小
   *
   * @return 总大小,字节为单位
   */
  static public long getTotalExternalMemorySize() {
    if (isSDCardEnable()) {
      //获取SDCard根目录
      File path = Environment.getExternalStorageDirectory();
      StatFs stat = new StatFs(path.getPath());
      long blockSize = stat.getBlockSize();
      long totalBlocks = stat.getBlockCount();
      return totalBlocks * blockSize;
    } else {
      return -1;
    }
  }

  /**
   * 获取SD卡剩余空间
   *
   * @return SD卡剩余空间
   */
  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
  public static String getFreeSpace() {
    if (!isSDCardEnable()) return "sdcard unable!";
    StatFs stat = new StatFs(getSDCardPath());
    long blockSize, availableBlocks;
    availableBlocks = stat.getAvailableBlocksLong();
    blockSize = stat.getBlockSizeLong();
    long size = availableBlocks * blockSize / 1024L;
    return String.valueOf(size);
  }

统一描述sdcard的信息

/**
   * 获取SD卡信息
   *
   * @return SDCardInfo
   */
  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
  public static String getSDCardInfo() {
    SDCardInfo sd = new SDCardInfo();
    if (!isSDCardEnable()) return "sdcard unable!";
    sd.isExist = true;
    StatFs sf = new StatFs(Environment.getExternalStorageDirectory().getPath());
    sd.totalBlocks = sf.getBlockCountLong();
    sd.blockByteSize = sf.getBlockSizeLong();
    sd.availableBlocks = sf.getAvailableBlocksLong();
    sd.availableBytes = sf.getAvailableBytes();
    sd.freeBlocks = sf.getFreeBlocksLong();
    sd.freeBytes = sf.getFreeBytes();
    sd.totalBytes = sf.getTotalBytes();
    return sd.toString();
  }

  public static class SDCardInfo {
    boolean isExist;
    long totalBlocks;
    long freeBlocks;
    long availableBlocks;
    long blockByteSize;
    long totalBytes;
    long freeBytes;
    long availableBytes;

    @Override
    public String toString() {
      return "isExist=" + isExist +
          "\ntotalBlocks=" + totalBlocks +
          "\nfreeBlocks=" + freeBlocks +
          "\navailableBlocks=" + availableBlocks +
          "\nblockByteSize=" + blockByteSize +
          "\ntotalBytes=" + totalBytes +
          "\nfreeBytes=" + freeBytes +
          "\navailableBytes=" + availableBytes;
    }
  }

总结

以上就是分别获取两个不同的存储空间总大小和可用大小的示例。希望对大家有用。

如有任何问题,请及时与我联系,谢谢!

这篇Android之获取手机内部及sdcard存储空间的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Android获取SD卡路径及SDCard内存的方法,包括了Android获取SD卡路径及SDCard内存的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android获取SD卡路径及SDCard内存的方法。分享给大家供大家参考。具体分析如下: 昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为: private String folder = "/sdcard/

  • 本文向大家介绍Android获取系统储存以及内存信息的方法(二),包括了Android获取系统储存以及内存信息的方法(二)的使用技巧和注意事项,需要的朋友参考一下 Android获取储存信息以及内存信息可以用adb命令查看。 adb查看系统内存信息以及储存信息: 命令:adb shell cat /proc/meminfo 代码: adb 获取手机储存大小: 命令:adb shell cat /p

  • 本文向大家介绍Android获取系统储存以及内存信息的方法(一),包括了Android获取系统储存以及内存信息的方法(一)的使用技巧和注意事项,需要的朋友参考一下 众所周知,Android的手机上的信息大部分都是可以通过代码获取的,比如说爱奇艺的离线储存功能上有一个最大储存大小/剩余储存大小的功能。 获取SD卡上的储存信息: 手机系统的内存也可以通过ActivityManager.getMemor

  • 本文向大家介绍Android开发之获取SD卡及手机ROM容量的方法,包括了Android开发之获取SD卡及手机ROM容量的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android获取SD卡及手机ROM容量的方法。分享给大家供大家参考,具体如下: 这里通过一个简单的小例子,来获取SD卡的容量和手机ROM的容量,代码如下: 具体的内容,可以通过分析android settings部分

  • 大多数新的android设备都有一个内部sdcard和一个外部sdcard。我想做一个文件资源管理器应用程序,但我不能找到如何获得路径使用在我的应用程序,因为 在大多数设备中只返回,但另一个外部sdcard有另一个路径,如。感谢任何帮助。

  • 本文向大家介绍Android 手机获取手机号实现方法,包括了Android 手机获取手机号实现方法的使用技巧和注意事项,需要的朋友参考一下 最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。 网上不符合需求的方法 Google了一下,网上的做法如下: 添加权限: <uses-permissionandroid:nameuses-permissionandroid:na