手机上的存储卡是可以随时插拔的,每次插拔时会像操作系统总发送Action广播事件。

使用StatFs文件系统来获取MicroSD存储卡的剩余容量,在使用前先判断是否插入了存储卡,如果不存在则不于计算

运行截图:

程序结构

  1. package com.example.asus.gary_024;
  2.  
  3. import android.os.Environment;
  4. import android.os.StatFs;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.ProgressBar;
  10. import android.widget.TextView;
  11.  
  12. import java.io.File;
  13. import java.text.DecimalFormat;
  14.  
  15. public class MainActivity extends AppCompatActivity {
  16. private Button myButton;
  17. private ProgressBar myProgressBar;
  18. private TextView myTextView;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. myButton = (Button)findViewById(R.id.mybutton);
  24. myProgressBar = (ProgressBar)findViewById(R.id.myprogressBar);
  25. myTextView = (TextView)findViewById(R.id.mytextView);
  26.  
  27. myButton.setOnClickListener(new Button.OnClickListener()
  28. {
  29.  
  30. @Override
  31. public void onClick(View v) {
  32. showSize();
  33. }
  34. });
  35. }
  36.  
  37. private void showSize(){
  38. //将TextView及ProgressBar设置空及为0
  39. myTextView.setText("");
  40. myProgressBar.setProgress(0);
  41.  
  42. //判断储存卡是否插入
  43. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
  44. {
  45. //将取得SD CARD文件路径一般是/sdcard
  46. File path = Environment.getExternalStorageDirectory();
  47. //通过StatFs看文件系统空间使用状况
  48. StatFs statFs = new StatFs(path.getPath());
  49. //Block数量
  50. long blockSize = statFs.getBlockSize();
  51. //总Block数量
  52. long totalBlocks = statFs.getBlockCount();
  53. //已使用的Block数量
  54. long availableBlocks = statFs.getAvailableBlocks();
  55. String[] total = fileSize(totalBlocks*blockSize);
  56. String[] available=fileSize(availableBlocks*blockSize);
  57. //使用getMax取得在main.xml里设置的ProgressBar最大值
  58. int ss = Integer.parseInt(available[0])*myProgressBar.getMax()/Integer.parseInt(total[0]);
  59.  
  60. myProgressBar.setProgress(ss);
  61. String text = "总共"+total[0]+total[1]+"\n";
  62. text+="可用"+available[0]+available[1];
  63. myTextView.setText(text);
  64. }else if(Environment.getExternalStorageState().equals(
  65. Environment.MEDIA_REMOVED)){
  66. String text = "SD CARD已删除";
  67. myTextView.setText(text);
  68. }
  69. }
  70. //返回为字符串数组[0]的大小为[1]\单位为KB或MB
  71. private String[] fileSize(long size)
  72. {
  73. String str = "";
  74. size /=1024;
  75. if(size>=1024)
  76. {
  77. str = "KB";
  78. size/=1024;
  79. if(size>=1024)
  80. {
  81. str = "MB";
  82. size/=1024;
  83. }
  84. }
  85. DecimalFormat formatter = new DecimalFormat();
  86. //每3个数字分隔,如1,000
  87. formatter.setGroupingSize(3);
  88. String result[] = new String[2];
  89. result[0] = formatter.format(size);
  90. result[1]=str;
  91. return result;
  92. }
  93.  
  94. }

MainActivity

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context="com.example.asus.gary_024.MainActivity">
  9.  
  10. <TextView
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:text="Gary_获得手机存储卡的容量"
  14. android:textSize="40px" />
  15.  
  16. <Button
  17. android:id="@+id/mybutton"
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:text="存储卡容量" />
  21.  
  22. <TextView
  23. android:id="@+id/mytextView"
  24. android:layout_width="match_parent"
  25. android:layout_height="wrap_content"
  26. android:textSize="40px" />
  27.  
  28. <ProgressBar
  29. android:id="@+id/myprogressBar"
  30. style="?android:attr/progressBarStyleHorizontal"
  31. android:max="100"
  32. android:layout_width="match_parent"
  33. android:layout_height="wrap_content" />
  34.  
  35. </LinearLayout>

activity_main.xml

一、界面布局

  一个Button按钮,一个TextView文本框和一个ProgressBar Widget控件

  点击Button按钮,在TextView文本框上显示手机卡的容量和手机卡剩余容量的大小,在ProgressBar Widget控件中能更好的显示容量,使显示效果一目了然

二、实现程序功能

1、添加Button按钮的单机事件响应机制,当点击Button按钮监听事件setOnClickListener时,调用showSize()显示存储卡的剩余容量

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. myButton = (Button)findViewById(R.id.mybutton);
  5. myProgressBar = (ProgressBar)findViewById(R.id.myprogressBar);
  6. myTextView = (TextView)findViewById(R.id.mytextView);
  7.  
  8. myButton.setOnClickListener(new Button.OnClickListener()
  9. {
  10.  
  11. @Override
  12. public void onClick(View v) {
  13. showSize();
  14. }
  15. });
  16. }

2、定义showSize()方法来显示存储卡的容量大小,具体实现流程如下

  分别设置TextView和ProgressBarw为空值

  获取SD CARD文件路径

  通过StatFs来查看文件系统控件使用情况

  分别获取总的Block数量和已使用的Block数量

  通过getMax获取在activity_main.xml中设置ProgressBar的最大值

  显示容量信息

  如果没有SD卡则输出"SD CARD已删除"提示

  1. private void showSize(){
  2. //将TextView及ProgressBar设置空及为0
  3. myTextView.setText("");
  4. myProgressBar.setProgress(0);
  5.  
  6. //判断储存卡是否插入
  7. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
  8. {
  9. //将取得SD CARD文件路径一般是/sdcard
  10. File path = Environment.getExternalStorageDirectory();
  11. //通过StatFs看文件系统空间使用状况
  12. StatFs statFs = new StatFs(path.getPath());
  13. //Block数量
  14. long blockSize = statFs.getBlockSize();
  15. //总Block数量
  16. long totalBlocks = statFs.getBlockCount();
  17. //已使用的Block数量
  18. long availableBlocks = statFs.getAvailableBlocks();
  19. String[] total = fileSize(totalBlocks*blockSize);
  20. String[] available=fileSize(availableBlocks*blockSize);
  21. //使用getMax取得在main.xml里设置的ProgressBar最大值
  22. int ss = Integer.parseInt(available[0])*myProgressBar.getMax()/Integer.parseInt(total[0]);
  23.  
  24. myProgressBar.setProgress(ss);
  25. String text = "总共"+total[0]+total[1]+"\n";
  26. text+="可用"+available[0]+available[1];
  27. myTextView.setText(text);
  28. }else if(Environment.getExternalStorageState().equals(
  29. Environment.MEDIA_REMOVED)){
  30. String text = "SD CARD已删除";
  31. myTextView.setText(text);
  32. }

3、在获取文件大小默认是字节,可以调用fileSize()来进行进制大小转换

  1. //返回为字符串数组[0]的大小为[1]\单位为KB或MB
  2. private String[] fileSize(long size)
  3. {
  4. String str = "";
  5. size /=1024;
  6. if(size>=1024)
  7. {
  8. str = "KB";
  9. size/=1024;
  10. if(size>=1024)
  11. {
  12. str = "MB";
  13. size/=1024;
  14. }
  15. }
  16. DecimalFormat formatter = new DecimalFormat();
  17. //每3个数字分隔,如1,000
  18. formatter.setGroupingSize(3);
  19. String result[] = new String[2];
  20. result[0] = formatter.format(size);
  21. result[1]=str;
  22. return result;
  23. }

备注:

在使用Android模拟器时,可以使用FAT32格式的磁盘镜像作为SD卡的模拟,具体实现过程如下:

Step1: 进入Android SDK目录文件下的tools子目录,运行如下命令

  1. mksdcard -1 sdcard 512M/your_path_for_img/sdcard.img
入这样就可以创建了一个512MB的SD卡镜像文件
 
Step2: 在运行模拟器狮指定模拟存储卡路径,注意需要使用完整路径
 
  1. emulator -sdcard/your_path_for_img/sdcard.img
 
在此时模拟器中就可以使用"/sdcard"这个路径来指向模拟的SD卡了。
 
在使用mksdcard命令时需要注意如下6点。
 
1)mycard命令可以使用3种尺寸:字节、KB和MB。如果只使用数字,表示字节。后面跟K,如262144K,表示262144KB,也可写为256M
 
2)mycard建立的虚拟文件最小为8MB,也就是说,模拟器只支持大于8MB的虚拟文件
 
3)-l命令行参数表示虚拟磁盘的卷标,可以没有该参数
 
4)虚拟文件的拓展名可以是任意的,如mycard.abc
 
5)mksdcard命令不会自动创建不存在的目录,因此,在执行上面的命令之前,要先在当前目录种创建一个card目录
 
6)mksdcard命令就是按实际大小生成的sdcard虚拟文件。也就是说,生成256MB的虚拟文件的尺寸就是256MB,如果要生成较大的虚拟文件,要看看自己的硬盘控件是否足够
 
执行完上面的命令后,执行下面的命令可以启动Android模拟器。
 
  1. emulator -avd avd1 -sdcard card/mycard img

Android_(自动化)获取手机存储卡的容量的更多相关文章

  1. python+adb实现自动化获取手机信息

    首先我们先看一下使用adb查看Android手机信息的指令 #获取手机名称NAME = 'adb shell getprop ro.product.model'#获取手机版本VERSION = 'ad ...

  2. Android_(传感器)获取手机中的传感器

    传感器是一种检测装置,能够感受被测量的信息,并能将检测和感受到的信息按一定规律变换成电信号或其它所需形式的信息输出 Android操作系统中内置了很多的传感器(物理装置),能够探测.感受外界的信号.物 ...

  3. Android获取全部存储卡挂载路径

    近期因项目需求.须要在存储卡查找文件,经測试发现部分手机挂载路径查找不到,这里分享一个有效的方法. /** * 获取全部存储卡挂载路径 * @return */ public static List& ...

  4. iOS 整理笔记 获取手机信息(UIDevice、NSBundle、NSLocale)

    /*    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发ap ...

  5. 利用RxJava获取手机已安装的App的图片、应用名称和版本号

    先上效果图: 获取手机已安装的App列表利用Android系统API就可以办到,这里为什么要引入RxJava?现在我们假设一下有下面几个需求: 1.我们不需要所有的App,只需要用户安装的第三方App ...

  6. iOS获取手机型号,类似iphone 7这种 含swift和OC

    获取手机设备信息,如name.model.version等,但如果想获取具体的手机型号,如iphone5.5s这种,就需要如下这种 swift: func phonetype () -> Str ...

  7. UI Automator Viewer获取手机镜像时报错

    使用UI Automator Viewer获取手机镜像时报错,具体信息如下: Error while obtaining UI hierarchy XML file: com.android.ddml ...

  8. Android-AsyncTask异步任务(获取手机联系人)

    本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...

  9. Android 获取手机Mac地址,手机名称

    /** * 获取手机mac地址<br/> * 错误返回12个0 */ public static String getMacAddress(Context context) { // 获取 ...

随机推荐

  1. Android获取网络时间的方法

    一.通过免费或者收费的API接口获取 1.免费 QQ:http://cgi.im.qq.com/cgi-bin/cgi_svrtime 淘宝:http://api.m.taobao.com/rest/ ...

  2. 解决 Ubuntu 19 安装openjdk 8后与openjfx不兼容

    小淘气放假了,孩子在上幼儿园的小朋友,报班也不能太变态嘛, 还是让他自己娱乐的时间多一点,但是现在在家的娱乐就是看电视,听说电视看多了越看越傻,就想方设法的给他找一点娱乐活动,把我闲置的树莓派给他装了 ...

  3. JS中数组与对象的遍历方法实例小结

    一.数组的遍历: 首先定义一个数组 1 arr=['snow','bran','king','nightking']; 1.for循环,需要知道数组的长度; 2.foreach,没有返回值,可以不知道 ...

  4. 【Swift后台】目录

    背景介绍 环境安装

  5. ——Java中的collection和collections的区别

    1.java.util.Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Coll ...

  6. GraphX介绍

    转自:https://www.cnblogs.com/txq157/p/5978747.html 1.GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理框架,它 ...

  7. Delphi TIdUDPServer组件

  8. 6、SSH远程管理服务实战

    1.SSH基本概述 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全.那SSH服务主要功能有哪些呢? 1.提供远程连接服务器的服务. 2.对传输 ...

  9. JDBC的两种sql命令发送器比较【Statement:PreparedStatement】

    PreparedStatement 接口继承 Statement接口如果需要多次执行一个SQL语句,可以使用PreparedStatement对象.在创建PreparedStatement对象时,通过 ...

  10. python常用模块:模块练习

    今日作业: 1.简述 什么是模块 模块就将一些函数功能封装在一个文件内,以‘文件名.py’命名,以“import 文件名”方式调用 模块有哪些来源  自定义.内置.DLL编译器.包模块的格式要求有哪些 ...