首先,我们看一下效果图:
一、StatFs讲解:
这是一个对系统上控件的总体信息的分析类,他是一个Unix statvfs 的包装器。
它的constructors是StatFs(String path),这里的path是一个fileSystem的根目录。
常用方法:
getAvilableBlocks():获得当前系统有多少可以被应用使用的块
getBlockSize():获得每一块的大小
getBlockCount():过得当前系统总共有多少块
我们主要使用这三个方法。
二、获取存储空间的工具类:
我们在代码中新建一个名为SDSizeUtils的java类,代码如下:
import android.content.Context;
import android.os.StatFs;
import android.text.format.Formatter;
import java.text.NumberFormat;
/**
* Created by fengjw on 2018/3/21.
*/
public class SDSizeUtils {
private final String INTERNAL_STORAGE_PATH = "/storage/emulated/0/"; //这里是因为电视机没有外置SD卡,所以获得内置SD卡路径
private Context mContext;
public SDSizeUtils(Context context){
mContext = context;
}
/**
* SD total size
*/
public String getSDTotalSize(){
StatFs fs = new StatFs(INTERNAL_STORAGE_PATH);
long blockSize = fs.getBlockSize();
long totalBlocks = fs.getBlockCount();
return Formatter.formatFileSize(mContext, blockSize * totalBlocks);
}
/**
* SD available size
*/
public String getSDAvailableSize(){
StatFs fs = new StatFs(INTERNAL_STORAGE_PATH);
long blockSize = fs.getBlockSize();
long availableBlocks = fs.getAvailableBlocks();
return Formatter.formatFileSize(mContext, blockSize * availableBlocks);
}
/**
* SD available size percent
*/
public String getSizePercent(){
StatFs fs = new StatFs(INTERNAL_STORAGE_PATH);
long totalBlocks = fs.getBlockCount();
long availableBlocks = fs.getAvailableBlocks();
NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setMaximumFractionDigits(2);
String percentSize = numberFormat.format(((float)availableBlocks / (float)totalBlocks) * 100);
return percentSize;
}
public float getSizePercent(int value){
StatFs fs = new StatFs(INTERNAL_STORAGE_PATH);
long totalBlocks = fs.getBlockCount();
Constants.debug("totalBlocks : " + totalBlocks);
long availableBlocks = fs.getAvailableBlocks();
float percentSize = ((float)availableBlocks / (float)totalBlocks) * 100;
return percentSize;
}
}
我们这里主要注意两点:
1.Formatter:formatter是一个用于格式化常见的值的类,具体细节我也没有看。
2.NumberFormat是一个帮助将其他类型的数据转化为String型。
我们因为在现实的时候需要使用两个值,当前剩余空间的百分比(String类型和int类型),所以我们构建了两个方法分别输出结果。
三、ProgressBar的使用:
ProgressBar的介绍这里不再赘述,需要的自行去官网查看。
首先,我们定义一个ProgressBar在layout布局中:
<ProgressBar
android:id="@+id/info_storage_pb"
android:layout_below="@+id/info_storage_tv"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_marginTop="10dp"
android:max="100"
android:progressDrawable="@drawable/info_progressbar"
android:layout_width="match_parent"
android:layout_height="10dp"/>
style定义了progressbar为水平方向;
progressDrawable是绘制progressbar,我们在其中主要定义如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"
android:drawable="@drawable/shape_progressbar_bg"/>
<item android:id="@android:id/progress">
<clip
android:drawable="@drawable/shape_progressbar_progress"
android:scaleWidth="100%"/>
</item>
</layer-list>
background:设置进度条的背景颜色
clip:定义进度条 的上层颜色,边角的角度。
然后我们再在代码中设置setProgress来更改当前的进度。
总结:仅仅学会调用API很简单,但是要深入其中,还是很难,还有很长的路要走呀~