admin管理员组文章数量:1025611
项目需要,每次插入U盘需要格式化。
刚看到这个需求的时候感觉很简单,调一行api就搞定的,事实证明还是太年轻了
android没有提供相应的api,于是百度
参考 Android格式化外部设备如USB等_AZZ的博客-CSDN博客
按照一贯的风格,直接CV大法,兴高采烈的发现行不通,有些类在android高版本都没了,这篇博客是基于android5.0,这会儿在我这用不成。
后来翻了很久,发现了StorageManager这个关键的类。
这个类在/frameworks/base/core/java/android/os/storage/StorageManager.java下,
StorageManager是Android SDK中管理存储设备的一个类。其中的存储设备分内部存储和外部存储,外部存储可以有SDCard、U盘等其他挂载的外设。
还有StorageVolume类
StorageVolume代表的是一个设备信息的数据结构,里面包含了名称、路径、挂载状态等等信息。
在StorageManager中我找到了两个方法
移除U盘:
格式化U盘:
这两个方法没有任何说明,并且是hide标签,意味着得用反射。还有参数volid我一度不知道是啥玩意儿。
尝试以后,通过传入StorageVolume.getid(usb的id),成功。
下面附上代码:
// 获取 StorageVolume 对象
public void getStoragePath(Context mContext) {
mStorageManager = (StorageManager)
mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
//暂且称之为获取usb列表
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
//拿到format方法
Method format = mStorageManager.getClass().getMethod("format", String.class);
//拿到StorageVolume 的getpath方法
Method getPath = storageVolumeClazz.getMethod("getPath");
//拿到StorageVolume 的getId方法
Method getId = storageVolumeClazz.getMethod("getId");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
//遍历列表
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = (String) getPath.invoke(storageVolumeElement);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
//如果当前的usb地址和我们定义的地址一样的话,就操作它
if (removable && path.equals(mPreferUsbPath)) {
String id = (String) getId.invoke(storageVolumeElement);
//格式化它!!
format.invoke(mStorageManager, id);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
以上,格式化USB算是完成了。
顺便还解决了移除USB功能,刚好是下周要做的功能,开心!!!
项目需要,每次插入U盘需要格式化。
刚看到这个需求的时候感觉很简单,调一行api就搞定的,事实证明还是太年轻了
android没有提供相应的api,于是百度
参考 Android格式化外部设备如USB等_AZZ的博客-CSDN博客
按照一贯的风格,直接CV大法,兴高采烈的发现行不通,有些类在android高版本都没了,这篇博客是基于android5.0,这会儿在我这用不成。
后来翻了很久,发现了StorageManager这个关键的类。
这个类在/frameworks/base/core/java/android/os/storage/StorageManager.java下,
StorageManager是Android SDK中管理存储设备的一个类。其中的存储设备分内部存储和外部存储,外部存储可以有SDCard、U盘等其他挂载的外设。
还有StorageVolume类
StorageVolume代表的是一个设备信息的数据结构,里面包含了名称、路径、挂载状态等等信息。
在StorageManager中我找到了两个方法
移除U盘:
格式化U盘:
这两个方法没有任何说明,并且是hide标签,意味着得用反射。还有参数volid我一度不知道是啥玩意儿。
尝试以后,通过传入StorageVolume.getid(usb的id),成功。
下面附上代码:
// 获取 StorageVolume 对象
public void getStoragePath(Context mContext) {
mStorageManager = (StorageManager)
mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
//暂且称之为获取usb列表
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
//拿到format方法
Method format = mStorageManager.getClass().getMethod("format", String.class);
//拿到StorageVolume 的getpath方法
Method getPath = storageVolumeClazz.getMethod("getPath");
//拿到StorageVolume 的getId方法
Method getId = storageVolumeClazz.getMethod("getId");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
//遍历列表
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = (String) getPath.invoke(storageVolumeElement);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
//如果当前的usb地址和我们定义的地址一样的话,就操作它
if (removable && path.equals(mPreferUsbPath)) {
String id = (String) getId.invoke(storageVolumeElement);
//格式化它!!
format.invoke(mStorageManager, id);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
以上,格式化USB算是完成了。
顺便还解决了移除USB功能,刚好是下周要做的功能,开心!!!
版权声明:本文标题:android 格式化USB 和移除USB(U盘) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1740323210a1751757.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论