andorid storage tatal and free
阿新 • • 發佈:2017-08-18
storage data android emulated
1 在Setting應用中,storage 顯示total and free code:
final File path = VolumeInfo.getPath(); final long freeBytes = path.getFreeSpace(); final long totalBytes = path.getTotalSpace(); final long usedBytes = totalBytes - freeBytes; final String used = Formatter.formatFileSize(context, usedBytes); final String total = Formatter.formatFileSize(context, totalBytes);
2 VolumeInfo.java 是hidden的,只能通過反射得到。代碼如下:
try { StorageManager sManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); Class class_StorageManager = StorageManager.class; Method method_getVolumes = class_StorageManager.getMethod("getVolumes"); List<Object> volumes = (List<Object>) method_getVolumes.invoke(sManager); mClassType = Class.forName("android.os.storage.VolumeInfo"); for (Object volumeInfo : volumes) { mGetMethod = mClassType.getDeclaredMethod("getPath"); File path = (File) mGetMethod.invoke(volumeInfo); final long freeBytes = path.getFreeSpace(); final long totalBytes = path.getTotalSpace(); final long usedBytes = totalBytes - freeBytes; Log.i("cyy1","freeBytes="+Formatter.formatFileSize(context,freeBytes)); Log.i("cyy1","usedBytes="+Formatter.formatFileSize(context,usedBytes)); mGetMethod1 = mClassType.getDeclaredMethod("getId"); String id = (String) mGetMethod1.invoke(volumeInfo); Log.i("cyy1","id="+id); } }catch (Exception e){ Log.i("cyy1",e.getMessage()); e.printStackTrace(); }
得到數據: 08-18 17:28:31.087 32148-32148/ I/cyy1: freeBytes=190 MB 08-18 17:28:31.088 32148-32148/ I/cyy1: usedBytes=22.68 GB 08-18 17:28:31.088 32148-32148/ I/cyy1: id=private 08-18 17:28:31.088 32148-32148/ I/cyy1: freeBytes=9.90 MB 08-18 17:28:31.088 32148-32148 I/cyy1: usedBytes=22.84 GB 08-18 17:28:31.088 32148-32148/ I/cyy1: id=emulated
其中emulated 是external stroage的數據。而private 是data的數據 3 可以通過以下code驗證: File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSizeLong(); long blockCount = stat.getBlockCountLong(); long availableBlocks = stat.getAvailableBlocksLong(); long avaibByte = stat.getAvailableBytes(); Log.i("cyy","avaibByte="+Formatter.formatFileSize(context,avaibByte)); long free= stat.getFreeBytes(); Log.i("cyy","free="+Formatter.formatFileSize(context,free)); String totalSize = Formatter.formatFileSize(context, blockCount*blockSize); String availableSize = Formatter.formatFileSize(context, availableBlocks*blockSize); Environment.getExternalStorageDirectory() 跟emulated 數據一致;Environment.getDataDirectory() 和private數據一致。
andorid storage tatal and free