就是利用反射原理。5.1 6.0 基本都一样。
8.1外置Sd卡路径
public String getSdCardPath() {
int TYPE_PUBLIC = 0;
File file = null;
String path = null;
StorageManager mStorageManager = getSystemService(StorageManager.class);
Class<?> mVolumeInfo = null;
try {
mVolumeInfo = Class.forName("android.os.storage.VolumeInfo");
Method getVolumes = mStorageManager.getClass().getMethod(
"getVolumes");
Method volType = mVolumeInfo.getMethod("getType");
Method isMount = mVolumeInfo.getMethod("isMountedReadable");
Method getPath = mVolumeInfo.getMethod("getPath");
List<Object> mListVolumeinfo = (List<Object>) getVolumes
.invoke(mStorageManager);
Log.d("getSdCardPath", "mListVolumeinfo.size="+mListVolumeinfo.size());
for (int i = 0; i < mListVolumeinfo.size(); i++) {
int mType = (Integer) volType.invoke(mListVolumeinfo.get(i));
Log.d("getSdCardPath", "mType=" + mType);
if (mType == TYPE_PUBLIC) {
boolean misMount = (Boolean) isMount.invoke(mListVolumeinfo.get(i));
Log.d("getSdCardPath", "misMount=" + misMount);
if (misMount) {
file = (File) getPath.invoke(mListVolumeinfo.get(i));
if (file != null) {
path = file.getAbsolutePath();
Log.d("getSdCardPath", "path=" + path);
return path;
}
}
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
7.0
private static String getStoragePath(Context mContext, boolean is_removale) {
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");
Method getPath = storageVolumeClazz.getMethod("getPath");
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 (is_removale == removable) {
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
外置SD卡大小
String path="/storage/sdcard1";
public void volumeSizeTest2(boolean existed){
if(existed){
android.os.StatFs f=new android.os.StatFs(path);
long blockSize= f.getBlockSizeLong();
long totalSize=f.getBlockCountLong();
long availableBlocks=f.getAvailableBlocksLong();
double sd1=(blockSize*totalSize*1.0)/1024/1024/1024;
double sd2=(blockSize*availableBlocks*1.0)/1024/1024/1024;
String totalSize1 = String.valueOf(sd1);
String str1 = totalSize1.substring(0, 5);
String availableBlocks1 = String.valueOf(sd2);
String str2 = availableBlocks1.substring(0, 5);
mInfo.setText(getString(R.string.sdcard_freesize)+ str2+"GB"+"\n\n"+getString(R.string.sdcard_totalsize)
+str1+"GB");
}else{
mInfo.setText(getString(R.string.sdcard_tips_failed));
}
}