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存储空间的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • android数据存储之文件存储方法

    文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中的. 概述 文件存取的核心就是输入流和输出流. Android文件的操作模式 文件的相关操作方法 文件读写的实现 openFileOutput和openFileInput方法 /** * openFIleOutput ,openFileInput * 这两种方法同sp一样只能讲文件保存到手机内存固定的路径中, * 默认为 /data/data/<packageName

  • Android获取内外置存储卡的方法

    以前的Android(4.1之前的版本)中,SDcard跟路径通过"/sdcard"或者"/mnt/sdcard"来表示存储卡,而在Jelly Bean系统中修改为了"/storage/sdcard0",以后可能还会有多个SDcard的情况. 目前为了保持和之前代码的兼容,sdcard路径做了link映射. 为了使您的代码更加健壮并且能够兼容以后的Android版本和新的设备,请通过Environment.getExternalStorageDi

  • android 获取手机内存及 内存可用空间的方法

    实例如下: //1.获取内存可用大小,内存路径 String path=Environment.getDataDirectory().getAbsolutePath(); String memoryAvaliSpace= Formatter.formatFileSize(this,getAvailSpace(path)); //2.获取sd卡可用大小,sd卡路径 String sdPath=Environment.getExternalStorageDirectory().getAbsolute

  • Android获取内置sdcard跟外置sdcard路径

    Android获取内置sdcard跟外置sdcard路径 Android获取内置sdcard跟外置sdcard路径.(测试过两个手机,亲测可用) 1.先得到外置sdcard路径,这个接口是系统提供的标准接口. 2.得到上一级文件夹目录 3.得到该目录的所有文件夹,根据判断得到内置sdcard跟外置sdcard. 4.程序运行的时候记得给程序添加读取sdcard的权限哦. /** * 得到sdcard的路径 * @return 返回一个字符串数组 下标0:内置sdcard 下标1:外置sdcard

  • Android获取SD卡路径及SDCard内存的方法

    本文实例讲述了Android获取SD卡路径及SDCard内存的方法.分享给大家供大家参考.具体分析如下: 昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为: private String folder = "/sdcard/DCIM/Camera/"(SD卡上拍照程序的图片存储路径); 后来发现这样写虽然一般不会出错,但不是很好,因为不同相机,可能路径会出问题.较好的方法是通过Environment 来获取路径,最后给出一个例子,教你怎样获取SDCard 的内存,显示出来告诉用

  • Android编程获取sdcard卡信息的方法

    本文实例讲述了Android编程获取sdcard卡信息的方法.分享给大家供大家参考,具体如下: public static SDCardInfo getSDCardInfo() { String sDcString = android.os.Environment.getExternalStorageState(); if (sDcString.equals(android.os.Environment.MEDIA_MOUNTED)) { File pathFile = android.os.E

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

    知识点: 内部存储空间获取总大小和可用大小: sdcard存储空间获取总大小和可用大小: 新名词记录{StatFs:描述文件系统信息的类} 概览 在开发中,我们或多或少都会用到存储空间进行存储数据.移动设备上可以有两种的存储方式:手机内部空间和sdcard外部空间.对于要使用存储空间,要使用哪一个?如何判断是否有足够的空间?sdcard是否挂载?等等诸多问题就来了. 对于设备内部存储空间来说,是一定会存在的.如果使用内部存储空间,我们需要做的是判断内部存储空间是否有足够大的可用空间给我们使用.现

  • Android ndk获取手机内部存储卡的根目录方法

    如下所示: jclass envcls = env->FindClass("android/os/Environment"); //获得类引用 if (envcls == nullptr) return 0; //找到对应的类,该类是静态的返回值是File jmethodID id = env->GetStaticMethodID(envcls, "getExternalStorageDirectory", "()Ljava/io/File;&

  • Android编程获取手机屏幕分辨率大小的方法

    本文实例讲述了Android编程获取手机屏幕分辨率大小的方法.分享给大家供大家参考,具体如下: import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.widget.TextView; public class A03Activity extends Activity { private TextView mTextView01; /** C

  • Android中获取手机屏幕大小的方法

    本文为大家解析Android中如何获取手机屏幕大小,提供一个解决方法,分享给大家供大家参考,具体内容如下 运行效果图: 运行程序后,当我们点击Button按钮时,可以看到下面的效果图: 具体代码: 我们可以通过使用类DisplayMetrics来获取手机屏幕的分辨率大小.DisplayMetrics类是获取手机屏幕各种属性的关键类.下面通过例子来展示如何获取手机屏幕的分辨率. 在布局文件main.xml中添加一个TextView对象,一个Button对象.其中TextView对象用来显示获得的分

  • Android编程获取手机后台运行服务的方法

    本文实例讲述了Android编程获取手机后台运行服务的方法.分享给大家供大家参考,具体如下: public static String getRunningServicesInfo(Context context) { StringBuffer serviceInfo = new StringBuffer(); final ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.A

  • Android获取手机系统版本等信息的方法

    本文实例讲述了Android获取手机系统版本等信息的方法.分享给大家供大家参考.具体如下: String phoneInfo = "Product: " + android.os.Build.PRODUCT; phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI; phoneInfo += ", TAGS: " + android.os.Build.TAGS; phoneInfo += &qu

  • Android 实现获取手机里面的所有图片详解及实例

    Android 实现获取手机里面的所有图片详解及实例 实现代码: public class MainActivity extends Activity { //查看图片按钮 private Button look; private Button add; //显示图片名称的list ListView show_list; ArrayList names = null; ArrayList descs= null; ArrayList fileNames = null; @Override pro

  • Android获取手机本机号码的实现方法

    Android获取手机本机号码的实现方法 反射TelephoneManager 获取本机号码,注意一下提供的接口有的SIM卡没写是获取不到的,该接口只适配Android5.0以上版本 public String getMsisdn(int slotId) { return getLine1NumberForSubscriber(getSubIdForSlotId(slotId)); } 权限 <uses-permission android:name="android.permission

  • Android编程检测手机录音权限是否打开的方法

    本文实例讲述了Android编程检测手机录音权限是否打开的方法.分享给大家供大家参考,具体如下: 6.0之前的权限检测只是检测到是否在清单文件中注册 Boolean flag = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.RECORD_AUDIO", "包名")); Boolean flag = PermissionChecker.checkSelfPer

  • android实现获取有线和无线Ip地址的方法

    本文实例讲述了android实现获取有线和无线Ip地址的方法.分享给大家供大家参考.具体如下: 做android的开发时,遇到了获取有线ip地址的问题.不多说 上代码! for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); if (intf.getNam

随机推荐