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;
} }
MainActivity
<?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>
activity_main.xml
一、界面布局
一个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
emulator -sdcard/your_path_for_img/sdcard.img
emulator -avd avd1 -sdcard card/mycard img
Android_(自动化)获取手机存储卡的容量的更多相关文章
- python+adb实现自动化获取手机信息
首先我们先看一下使用adb查看Android手机信息的指令 #获取手机名称NAME = 'adb shell getprop ro.product.model'#获取手机版本VERSION = 'ad ...
- Android_(传感器)获取手机中的传感器
传感器是一种检测装置,能够感受被测量的信息,并能将检测和感受到的信息按一定规律变换成电信号或其它所需形式的信息输出 Android操作系统中内置了很多的传感器(物理装置),能够探测.感受外界的信号.物 ...
- Android获取全部存储卡挂载路径
近期因项目需求.须要在存储卡查找文件,经測试发现部分手机挂载路径查找不到,这里分享一个有效的方法. /** * 获取全部存储卡挂载路径 * @return */ public static List& ...
- iOS 整理笔记 获取手机信息(UIDevice、NSBundle、NSLocale)
/* iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发ap ...
- 利用RxJava获取手机已安装的App的图片、应用名称和版本号
先上效果图: 获取手机已安装的App列表利用Android系统API就可以办到,这里为什么要引入RxJava?现在我们假设一下有下面几个需求: 1.我们不需要所有的App,只需要用户安装的第三方App ...
- iOS获取手机型号,类似iphone 7这种 含swift和OC
获取手机设备信息,如name.model.version等,但如果想获取具体的手机型号,如iphone5.5s这种,就需要如下这种 swift: func phonetype () -> Str ...
- UI Automator Viewer获取手机镜像时报错
使用UI Automator Viewer获取手机镜像时报错,具体信息如下: Error while obtaining UI hierarchy XML file: com.android.ddml ...
- Android-AsyncTask异步任务(获取手机联系人)
本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...
- Android 获取手机Mac地址,手机名称
/** * 获取手机mac地址<br/> * 错误返回12个0 */ public static String getMacAddress(Context context) { // 获取 ...
随机推荐
- 修改hosts文件 解决coursera可以登录但无法播放视频的问题
我们经常为了学习或者了解一些领域的知识为访问国外的网站,但是在国内,很多优秀的网站都被封锁了.在GFW(墙)的几种封锁方式中,有一种就是DNS污染,GFW会对域名解析过程进行干扰,使得某些被干扰的域名 ...
- ns nat rule
ns nat rule NAT实现方式: NAT的实现方式有三种,即静态转换(Static Nat).动态转换(Dynamic Nat) 和 端口多路复用(OverLoad). 静态转换是指将内部网络 ...
- opencv+ linux + cmake 生成 opencv静态库
您可以省去如下步骤,直接下载我编译好的: http://download.csdn.net/detail/u011258240/9710331 一.编译opencv2.4 不带contrib 1. ...
- PHP扩展之 Imagick安装
最近的PHP项目中,需要用到切图和缩图的效果,在本地windows开发环境,安装过程遇到好多问题,在此与大家分享. php官网里,一大群老外也看不懂这玩意怎么装,主要原因在于,php版本庞杂,还有x8 ...
- location(重定向,跳转到其他网页)
<?php header('Location : https://www.baidu.com'); 这里是在响应头中添加一个 location 的头信息 客户端浏览器在接收到这个头信息过后会自动 ...
- 币种大写算法(js)
注意事项:小数精度处理问题,n*10出现精度误差,如1.88*10计算得18.799999999999997,实际想要的数据是18.8: 思路一:小数变成整数(通过字符串处理),计算后,变成小数: 思 ...
- linux 启动tomcat
操作步骤: 第一步:进入tomcat的bin目录 cd /usr/local/tomcat/bin 第二步:使用tomcat关闭命令 ./shutdown.sh 第三步:查看tomcat是否关闭 ps ...
- jdk提供的线程协调API suspend/resume wait/notify park/unpark
线程通信(如 线程执行先后顺序,获取某个线程执行的结果等)有多种方式: 文件共享 线程1 --写入--> 文件 < --读取-- 线程2 网络共享 变量共享 线程1 --写入--> ...
- zencart批量插入TEXT文本属性attributes
有时候上传的产品与多级分类比较多,在后台添加文本属性如Name,Number等需要顾客自定义的内容就比较费神了.现在只需将以下代码保存为insert_attributes.php,变量$options ...
- BZOJ 1015 并查集&连通块
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直接或 ...