安卓获取内部存储信息

devtools/2024/10/15 5:47:47/

目录

  • 前言
  • 获取存储容量


前言

在这里插入图片描述

原生系统设置里的存储容量到底是怎么计算的,跟踪源码,涉及到VolumeInfo、StorageManagerVolumeProvider、PrivateStorageInfo、StorageStatsManager......等等,java上层没有办法使用简单的api获取到吗?搞了半天,总算获取到了,话不多说,直接上代码。

获取存储容量

    /*** 内部总存储空间*/public static long getStorageTotal(Context context) {StorageStatsManager storageStatsManager = (StorageStatsManager) context.getSystemService(STORAGE_STATS_SERVICE);try {return storageStatsManager.getTotalBytes(StorageManager.UUID_DEFAULT);} catch (IOException e) {e.printStackTrace();}return 0;}/*** 内部可用空间*/public static long getStorageFree(Context context) {StorageStatsManager storageStatsManager = (StorageStatsManager) context.getSystemService(STORAGE_STATS_SERVICE);try {return storageStatsManager.getFreeBytes(StorageManager.UUID_DEFAULT);} catch (IOException e) {e.printStackTrace();}return 0;}/*** SD卡总空间*/public static long getSdCardTotal(Context context) {// 获取所有可用的存储卷File[] externalFiles = context.getExternalFilesDirs(null);for (File file : externalFiles) {if (Environment.isExternalStorageRemovable(file) && !file.getAbsolutePath().contains("emulated")) {StatFs stat = new StatFs(file.getPath());long blockSize = stat.getBlockSizeLong();long totalBlocks = stat.getBlockCountLong();return totalBlocks * blockSize;}}return 0;}/*** SD卡可用空间*/public static long getSdCardFree(Context context) {// 获取所有可用的存储卷File[] externalFiles = context.getExternalFilesDirs(null);for (File file : externalFiles) {if (Environment.isExternalStorageRemovable(file) && !file.getAbsolutePath().contains("emulated")) {StatFs stat = new StatFs(file.getPath());long blockSize = stat.getBlockSizeLong();long availableBlocks = stat.getAvailableBlocksLong();return availableBlocks * blockSize;}}return 0;}// 格式化文件大小为人类可读的格式private static String formatFileSize(long size) {String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};int unitIndex = 0;double fileSize = size;while (fileSize > 1000 && unitIndex < units.length - 1) {fileSize = fileSize / 1000;unitIndex++;}return String.format("%.2f %s", fileSize, units[unitIndex]);}

打印下log看一下:

在这里插入图片描述


细心的小伙伴肯定发现单位换算是1000而不是1024了,为什么呢?

其实跟我们电脑上的硬盘存储一样,我们买硬盘的时候会发现1T的容量实际只有930G左右,厂商会解释说那是因为电脑系统采用的1024进制造成容量识别误差,因为厂商们生产的时候都是按照1T=1000G…1KB=1000B的进制的,现在手机厂商也学了这一套,标出64G,128G的容量也是按照1000进制的。 奸商啊,要是1024岂不是能放更多东西,哼,

UUID是什么?

UUID_DEFAULT 是一个常量,表示默认存储的 UUID。在这里,它代表默认存储卷的 UUID,通常指的是内部存储或者主要的外部存储(比如 SD 卡)。

在 Android 设备上,不同的存储卷可以具有不同的标识符(UUID),用于唯一标识每个存储卷。StorageManager.UUID_DEFAULT 是指向默认存储卷的 UUID,因此在获取存储信息时,使用这个 UUID 可以获得默认存储卷的存储空间信息。
在这里插入图片描述
更进一步的了解,参考谷歌官方:
UUID

StatFs
另外一点就是StatFs,StatFs 类是 Android 提供的用于获取文件系统信息的类,通常使用 StatFs 类来获取存储卷(如内部存储、外部 SD 卡)的文件系统信息,在应用程序中对存储空间进行监测和管理。通过 StatFs 可以获取存储卷的总大小、可用大小、文件块的大小等信息,我们这里就是使用不同文件系统的块数*每块的字节数进而获取总大小的。


http://www.ppmy.cn/devtools/44928.html

相关文章

艾体宝洞察 | Redis Enterprise对比ElastiCache

选择缓存数据库时&#xff0c;如何在Amazon ElastiCache和Redis Enterprise之间做出选择&#xff0c;应当考虑哪些标准&#xff1f; ElastiCache 通常可以满足基本的缓存需求&#xff0c;因此是一种适合初始阶段的解决方案。但随着使用量的增加&#xff0c;ElastiCache很快会变…

elasticsearch有什么用

Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它被广泛用于构建实时的、可扩展的搜索和分析应用程序。以下是Elasticsearch的主要用途和功能&#xff1a;12 全文搜索&#xff1a;Elasticsearch提供强大的全文搜索功能&#xff0c;可以处理大量的文本数据&…

Ubuntu开发入门之“制作Ubuntu rootfs根文件系统镜像“

Ubuntu开发入门之“制作Ubuntu rootfs根文件系统镜像” 问题描述解决方法1.首先从官网下载最基础的ubuntu base核心文件,ubuntu core.2.接下来就是制作一个基础功能的根文件系统3.修改可用源4.接下来就是挂载根文件系统,进行模拟安装应用5.根文件系统安装常用的工具和配置用户…

《mysql轻松学习·一》

SQL:结构化查询语言&#xff0c;用于访问和操作数据库&#xff0c;包括数据定义&#xff0c;数据操纵&#xff0c;数据查询&#xff0c;数据控制。 1、命令行 select version(); //查看当前版本 status; //查看用户信息&#xff0c;端口&#xff0c;版本号等信息 show databas…

恒压频比开环控制系统Matlab/Simulink仿真分析(SPWM控制方式)

介绍恒压频比的开环控制方法驱动永磁同步电机的转动&#xff0c;首先分析恒压频比的控制原理&#xff0c;然后在Matlab/Simulink中进行永磁同步电机恒压频比开环控制系统的仿真分析&#xff0c;最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行工程实现。 一、…

使用nexus搭建的docker私库,定期清理无用的镜像,彻底释放磁盘空间

一、背景 我们使用nexus搭建了docker镜像&#xff0c;随着推送的镜像数量越来越多&#xff0c;导致nexus服务器的磁盘空间不够用了。于是&#xff0c;我们急需先手动删除一些过期的镜像&#xff0c;可发现磁盘空间并没有释放。 那么&#xff0c;如何才能彻底释放掉呢&#xff…

【退役之Java面试经历】第一次面试记录和复盘, Action!

一、简历 两段工作经历&#xff0c;四个项目 二、面试 技术面试 总体还行&#xff0c;关于 redis 和 rabbitmq 以及 spring boot&#xff0c;spring cloud 的知识&#xff0c;回答得还可以。但是&#xff0c;还问到了 “单点登录”、“撰写需求分析文档和操作手册”等盲点。…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第30课-门的移动动画

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第30课-门的移动动画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…