Android_(自动化)获取手机存储卡的容量
手机上的存储卡是可以随时插拔的,每次插拔时会像操作系统总发送Action广播事件。
使用StatFs文件系统来获取MicroSD存储卡的剩余容量,在使用前先判断是否插入了存储卡,如果不存在则不于计算
运行截图:
程序结构
package com.example.asus.gary_024; import android.os.Environment; import android.os.StatFs; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import java.io.File; import java.text.DecimalFormat; public class MainActivity extends AppCompatActivity { private Button myButton; private ProgressBar myProgressBar; private TextView myTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myButton = (Button)findViewById(R.id.mybutton); myProgressBar = (ProgressBar)findViewById(R.id.myprogressBar); myTextView = (TextView)findViewById(R.id.mytextView); myButton.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { showSize(); } }); } private void showSize(){ //将TextView及ProgressBar设置空及为0 myTextView.setText(""); myProgressBar.setProgress(0); //判断储存卡是否插入 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //将取得SD CARD文件路径一般是/sdcard File path = Environment.getExternalStorageDirectory(); //通过StatFs看文件系统空间使用状况 StatFs statFs = new StatFs(path.getPath()); //Block数量 long blockSize = statFs.getBlockSize(); //总Block数量 long totalBlocks = statFs.getBlockCount(); //已使用的Block数量 long availableBlocks = statFs.getAvailableBlocks(); String[] total = fileSize(totalBlocks*blockSize); String[] available=fileSize(availableBlocks*blockSize); //使用getMax取得在main.xml里设置的ProgressBar最大值 int ss = Integer.parseInt(available[0])*myProgressBar.getMax()/Integer.parseInt(total[0]); myProgressBar.setProgress(ss); String text = "总共"+total[0]+total[1]+"\n"; text+="可用"+available[0]+available[1]; myTextView.setText(text); }else if(Environment.getExternalStorageState().equals( Environment.MEDIA_REMOVED)){ String text = "SD CARD已删除"; myTextView.setText(text); } } //返回为字符串数组[0]的大小为[1]\单位为KB或MB private String[] fileSize(long size) { String str = ""; size /=1024; if(size>=1024) { str = "KB"; size/=1024; if(size>=1024) { str = "MB"; size/=1024; } } DecimalFormat formatter = new DecimalFormat(); //每3个数字分隔,如1,000 formatter.setGroupingSize(3); String result[] = new String[2]; result[0] = formatter.format(size); result[1]=str; return result; } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.asus.gary_024.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Gary_获得手机存储卡的容量" android:textSize="40px" /> <Button android:id="@+id/mybutton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="存储卡容量" /> <TextView android:id="@+id/mytextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="40px" /> <ProgressBar android:id="@+id/myprogressBar" style="?android:attr/progressBarStyleHorizontal" android:max="100" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
一、界面布局
一个Button按钮,一个TextView文本框和一个ProgressBar Widget控件
点击Button按钮,在TextView文本框上显示手机卡的容量和手机卡剩余容量的大小,在ProgressBar Widget控件中能更好的显示容量,使显示效果一目了然
二、实现程序功能
1、添加Button按钮的单机事件响应机制,当点击Button按钮监听事件setOnClickListener时,调用showSize()显示存储卡的剩余容量
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myButton = (Button)findViewById(R.id.mybutton); myProgressBar = (ProgressBar)findViewById(R.id.myprogressBar); myTextView = (TextView)findViewById(R.id.mytextView); myButton.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { showSize(); } }); }
2、定义showSize()方法来显示存储卡的容量大小,具体实现流程如下
分别设置TextView和ProgressBarw为空值
获取SD CARD文件路径
通过StatFs来查看文件系统控件使用情况
分别获取总的Block数量和已使用的Block数量
通过getMax获取在activity_main.xml中设置ProgressBar的最大值
显示容量信息
如果没有SD卡则输出"SD CARD已删除"提示
private void showSize(){ //将TextView及ProgressBar设置空及为0 myTextView.setText(""); myProgressBar.setProgress(0); //判断储存卡是否插入 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //将取得SD CARD文件路径一般是/sdcard File path = Environment.getExternalStorageDirectory(); //通过StatFs看文件系统空间使用状况 StatFs statFs = new StatFs(path.getPath()); //Block数量 long blockSize = statFs.getBlockSize(); //总Block数量 long totalBlocks = statFs.getBlockCount(); //已使用的Block数量 long availableBlocks = statFs.getAvailableBlocks(); String[] total = fileSize(totalBlocks*blockSize); String[] available=fileSize(availableBlocks*blockSize); //使用getMax取得在main.xml里设置的ProgressBar最大值 int ss = Integer.parseInt(available[0])*myProgressBar.getMax()/Integer.parseInt(total[0]); myProgressBar.setProgress(ss); String text = "总共"+total[0]+total[1]+"\n"; text+="可用"+available[0]+available[1]; myTextView.setText(text); }else if(Environment.getExternalStorageState().equals( Environment.MEDIA_REMOVED)){ String text = "SD CARD已删除"; myTextView.setText(text); }
3、在获取文件大小默认是字节,可以调用fileSize()来进行进制大小转换
//返回为字符串数组[0]的大小为[1]\单位为KB或MB private String[] fileSize(long size) { String str = ""; size /=1024; if(size>=1024) { str = "KB"; size/=1024; if(size>=1024) { str = "MB"; size/=1024; } } DecimalFormat formatter = new DecimalFormat(); //每3个数字分隔,如1,000 formatter.setGroupingSize(3); String result[] = new String[2]; result[0] = formatter.format(size); result[1]=str; return result; }
备注:
在使用Android模拟器时,可以使用FAT32格式的磁盘镜像作为SD卡的模拟,具体实现过程如下:
Step1: 进入Android SDK目录文件下的tools子目录,运行如下命令
mksdcard -1 sdcard 512M/your_path_for_img/sdcard.img
入这样就可以创建了一个512MB的SD卡镜像文件
Step2: 在运行模拟器狮指定模拟存储卡路径,注意需要使用完整路径
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模拟器。
emulator -avd avd1 -sdcard card/mycard img
(如需转载学习,请标明出处)