格式化一张SD卡,流程分两步
- 获取该SD卡插入后生成的VolumeInfo
- 调用StorageManager的format方法
安卓系统是基于LINUX系统的,LINUX系统支持ext格式和vfat格式(vfat就是fat格式一家,从fat16到exfat都有)。
关于挂载,一张SD卡的状态有很多种,这里给出VolumeInfo定义的状态(它其实是Vold中定义的):
//插上了,可以挂载,但还没挂载上
public static final int STATE_UNMOUNTED = IVold.VOLUME_STATE_UNMOUNTED;
//正在检查。检查完之后会告诉我们是否可挂载
public static final int STATE_CHECKING = IVold.VOLUME_STATE_CHECKING;
//已挂载
public static final int STATE_MOUNTED = IVold.VOLUME_STATE_MOUNTED;
//已挂载,但设备只读
public static final int STATE_MOUNTED_READ_ONLY = IVold.VOLUME_STATE_MOUNTED_READ_ONLY;
//正在格式化。设备格式化完成后,会变为UNMOUNTED状态。这时候需要去再挂载一下
public static final int STATE_FORMATTING = IVold.VOLUME_STATE_FORMATTING;
//正在拔出。
public static final int STATE_EJECTING = IVold.VOLUME_STATE_EJECTING;
//插上了,但设备无法挂载。一般是因为文件系统不支持的
public static final int STATE_UNMOUNTABLE = IVold.VOLUME_STATE_UNMOUNTABLE;
//已拔出
public static final int STATE_REMOVED = IVold.VOLUME_STATE_REMOVED;
//没拔好,文件有损坏
public static final int STATE_BAD_REMOVAL = IVold.VOLUME_STATE_BAD_REMOVAL;
格式化SD卡(VFAT格式)
final StorageManager storageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
for(VolumeInfo volume : storageManager.getVolumes() {
try {
if(volume.type == VolumeInfo.TYPE_PUBLIC) {
storageManager.format(volumeInfo.id);
storageManager.mount(volumeInfo.id);
}
} catch (Exception exception) {
//TODO
}
}
格式化SD卡(NTFS格式)
首先判断SD卡是何种类型的(内置,外置或未知)
public enum StorageType {
INTERNAL, // An internal Volume, e.g. EMMC
EXTERNAL_CARD, // An external card such as SD card or memory stick
UNKNOWN // unknown device
}
private static StorageType getVolumeType(VolumeInfo volume) {
int volumeType = volume.getType();
if (volumeType == VolumeInfo.TYPE_EMULATED) {
return StorageType.INTERNAL;
}
if (volumeType == VolumeInfo.TYPE_PUBLIC) {
DiskInfo disk = volume.getDisk();
int diskFlags = (disk != null) ? disk.flags : 0;
if ((diskFlags & DiskInfo.FLAG_SD) != 0) {
return StorageType.EXTERNAL_CARD;
}
}
return StorageType.UNKNOWN;
}
for (VolumeInfo volumeInfo : storageManager.getVolumes()) {
//这里NTFS的SD卡未挂载,类型算是未知
if (getVolumeType(volumeInfo) == StorageType.UNKNOWN) {
try {
storageManager.format(volumeInfo.id);
storageManager.mount(volumeInfo.id);
} catch (Exception exception) {
//TODO
}
}
}