安卓应用开发实战:[12]保存文件到SD卡
1、通过查看安卓系统的设置程序功能,可以设想我们可以通过分析安卓系统的设置程序的源代码,得到获取存储设备信息部分的主要代码。
![安卓应用开发实战:[12]保存文件到SD卡](https://exp-picture.cdn.bcebos.com/bd72f23834bb19efac3040a0497bd28287893ac7.jpg)
2、为了简单起见,我设计了如图所示的简单布局文件,xml文件如下:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="#000000" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="5dp" > <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SD卡总空间:" android:textSize="20dp" android:textColor="#ffffff" /> <TextView android:id="@+id/tvSdTotalSize" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="100MB" android:textSize="20dp" android:textColor="#ffffff"/> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SD卡剩余空间:" android:textSize="20dp" android:textColor="#ffffff" /> <TextView android:id="@+id/tvSdAvailSize" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="100MB" android:textSize="20dp" android:textColor="#ffffff"/> </TableRow> </LinearLayout>
![安卓应用开发实战:[12]保存文件到SD卡](https://exp-picture.cdn.bcebos.com/d3c39889a146b7b1fb963309c77c34b33d4135c7.jpg)
3、主要代码则下面所示:
public class MainActivity extends Activity {
TextView tvSdTotalSize = null;
TextView tvSdAvailSeze = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//渲染界面
setContentView(R.layout.activity_main);
//寻找控件
tvSdTotalSize = (TextView) this.findViewById(R.id.tvSdTotalSize);
tvSdAvailSeze = (TextView) this.findViewById(R.id.tvSdAvailSize);
//获得SD卡容量和剩余量
final StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
final long blockSize = stat.getBlockSize();
final long totalBlocks = stat.getBlockCount();
final long availableBlocks = stat.getAvailableBlocks();
long mTotalSize = totalBlocks * blockSize;
long mAvailSize = availableBlocks * blockSize;
String mAvailSize2String = Formatter.formatFileSize(getApplicationContext(), mAvailSize);
String mTotalSize2String = Formatter.formatFileSize(getApplicationContext(), mTotalSize);
//显示
tvSdTotalSize.setText(mTotalSize2String);
tvSdAvailSeze.setText(mAvailSize2String);
}
}
![安卓应用开发实战:[12]保存文件到SD卡](https://exp-picture.cdn.bcebos.com/35f2224133bad3411f12ad83427622bc7cc52cc7.jpg)
4、StatFs类用于获得存储设备的文件系统的空间信息,new对象时候要求传入设备路径信息,所以用了Environment.getExternalStorageDirectory().getPath()方法获得SD卡的路径Environment用于获得手机环境信息。要获得其他存储设备的空间信息,修改这一句就可以了。
![安卓应用开发实战:[12]保存文件到SD卡](https://exp-picture.cdn.bcebos.com/c8373cbc7dc5cf67093099f28e96b814f5d026c7.jpg)
5、blockSize:块大小,totalBlocks:总共要多少块,availableBlocks:剩余多少块。以存储块来获得内存信息,stat.getBlockSize()方法获得块大小,stat.getBlockCount()和stat.getAvailableBlocks()的返回值则是以块为单位的,所以要乘以块大小才得到以字节为单位的内存大小。
![安卓应用开发实战:[12]保存文件到SD卡](https://exp-picture.cdn.bcebos.com/d4071b96b814f4d0926c8466cdfe474ec38323c7.jpg)
6、Formatter.formatFileSize()这个方法可以把以字节为单位的long型值自动转换单位,并用字符串表示,比如Formatter.formatFileSize(getApplicationContext(), mAvailSize),当 mAvailSize=100*1024*1024,则,返回的字符串为“100MB”。
![安卓应用开发实战:[12]保存文件到SD卡](https://exp-picture.cdn.bcebos.com/47bf594ec28333bf168079fbdbb8b43ea9db1dc7.jpg)