找了很久,发现了StorageManager这个关键的类。
这个类在/frameworks/base/core/java/android/os/storage/StorageManager.java下,
StorageManager是Android SDK中管理存储设备的一个类。其中的存储设备分内部存储和外部存储,外部存储可以有SDCard、U盘等其他挂载的外设。
在StorageManager中我找到了几个关键方法

这几个方法没有任何说明,并且是hide标签,意味着得用反射。还有参数volid我一度不知道是啥玩意儿。
尝试以后,通过传入StorageVolume.getid(usb的id),成功。
最后附上格式化SD卡代码,注意 格式完SD卡后,需要挂载SD后才能正常使用。
/**
* 格式化SD卡
* @param mContext
* @return 格式化sd卡是否成功
*/
public static Boolean getStoragePath(Context mContext) {
Boolean isSuccess = false;
StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
//拿到format方法格式化
Method format = mStorageManager.getClass().getMethod("format", String.class);
//挂载方法
Method mount = mStorageManager.getClass().getMethod("mount", String.class);
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);
if (removable && path.equals(getSDcardDir(mContext)

本文介绍了如何利用Android的StorageManager类进行SD卡格式化以及获取和清理其他应用程序的缓存数据。通过反射调用隐藏方法,实现了对特定应用的缓存和数据大小的获取及清理功能。

3334

被折叠的 条评论
为什么被折叠?



