当前位置: 首页 > news >正文

安卓获取内部存储信息

目录

  • 前言
  • 获取存储容量


前言

在这里插入图片描述

原生系统设置里的存储容量到底是怎么计算的,跟踪源码,涉及到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 可以获取存储卷的总大小、可用大小、文件块的大小等信息,我们这里就是使用不同文件系统的块数*每块的字节数进而获取总大小的。

相关文章:

  • 使用 Django ORM 进行数据库操作
  • 《逆水寒》手游周年庆,热度不减反增引发热议
  • Linux内核 -- 汇编 arm 处理器模式切换
  • spring中处理跨域的3种方案
  • 深入理解linux文件系统与日志分析
  • 智能化改造的关键点
  • 不是我愿意孤独,而是周围找不到同类
  • 大模型之路,从菜鸟到模型大师只需要一步
  • 初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】
  • 如何构建最小堆?
  • 爬虫学习--18.反爬斗争 selenium(3)
  • Inno Setup磁盘跨越必须启用,因为程序大于21000000000
  • 解析Java中1000个常用类:Error类,你学会了吗?
  • 考CCIE的难点在哪?英语不好?
  • 等保系列之——网络安全等级保护测评工作流程及工作内容
  • .pyc 想到的一些问题
  • [case10]使用RSQL实现端到端的动态查询
  • 2018一半小结一波
  • gf框架之分页模块(五) - 自定义分页
  • hadoop集群管理系统搭建规划说明
  • linux安装openssl、swoole等扩展的具体步骤
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 产品三维模型在线预览
  • 开源SQL-on-Hadoop系统一览
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 算法---两个栈实现一个队列
  • 小试R空间处理新库sf
  • 自制字幕遮挡器
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 如何用纯 CSS 创作一个货车 loader
  • ​什么是bug?bug的源头在哪里?
  • ​数据链路层——流量控制可靠传输机制 ​
  • #nginx配置案例
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)Android开发优化---------UI优化
  • (2)空速传感器
  • (2015)JS ES6 必知的十个 特性
  • (八)Flink Join 连接
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)winform之ListView
  • ***检测工具之RKHunter AIDE
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .Mobi域名介绍
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET构架之我见