小智 76
雅罗斯拉夫的回答将给出SD卡的大小,而不是可用空间.StatF getAvailableBlocks()将返回正常程序仍可访问的块数.这是我正在使用的功能:
public static float megabytesAvailable(File f) {
StatFs stat = new StatFs(f.getPath());
long bytesAvailable = (long)stat.getBlockSize() * (long)stat.getAvailableBlocks();
return bytesAvailable / (1024.f * 1024.f);
}
Run Code Online (Sandbox Code Playgroud)
public static float megabytesAvailable(File f) {
StatFs stat = new StatFs(f.getPath());
long bytesAvailable = 0;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)
bytesAvailable = (long) stat.getBlockSizeLong() * (long) stat.getAvailableBlocksLong();
else
bytesAvailable = (long) stat.getBlockSize() * (long) stat.getAvailableBlocks();
return bytesAvailable / (1024.f * 1024.f);
}
Run Code Online (Sandbox Code Playgroud)
Yar*_*huk 53
试试这段代码:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
System.out.println("Megs :"+megAvailable);
Run Code Online (Sandbox Code Playgroud)
getBlockCount() - 返回SD卡的大小;
getAvailableBlocks() - 返回正常程序仍可访问的块数(感谢Joe)
Muh*_*rif 22
我设计了一些随时可用的功能,以获得不同单位的可用空间.您只需将其中任何一个复制到项目中即可使用这些方法.
/**
* @return Number of bytes available on External storage
*/
public static long getAvailableSpaceInBytes() {
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace;
}
/**
* @return Number of kilo bytes available on External storage
*/
public static long getAvailableSpaceInKB(){
final long SIZE_KB = 1024L;
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace/SIZE_KB;
}
/**
* @return Number of Mega bytes available on External storage
*/
public static long getAvailableSpaceInMB(){
final long SIZE_KB = 1024L;
final long SIZE_MB = SIZE_KB * SIZE_KB;
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace/SIZE_MB;
}
/**
* @return Number of gega bytes available on External storage
*/
public static long getAvailableSpaceInGB(){
final long SIZE_KB = 1024L;
final long SIZE_GB = SIZE_KB * SIZE_KB * SIZE_KB;
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace/SIZE_GB;
}
Run Code Online (Sandbox Code Playgroud)
另外,如果要检查内部存储器的可用空间,请使用:
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
Run Code Online (Sandbox Code Playgroud)
...
自API版本18以来引入了新方法.
我使用类似的东西进行大磁盘缓存大小估计(对于Picasso OkHttp下载缓存).助手方法是这样的:
private static final String BIG_CACHE_PATH = "my-cache-dir";
private static final float MAX_AVAILABLE_SPACE_USE_FRACTION = 0.9f;
private static final float MAX_TOTAL_SPACE_USE_FRACTION = 0.25f;
static File createDefaultCacheDirExample(Context context) {
File cache = new File(context.getApplicationContext().getCacheDir(), BIG_CACHE_PATH);
if (!cache.exists()) {
cache.mkdirs();
}
return cache;
}
/**
* Calculates minimum of available or total fraction of disk space
*
* @param dir
* @return space in bytes
*/
@SuppressLint("NewApi")
static long calculateAvailableCacheSize(File dir) {
long size = 0;
try {
StatFs statFs = new StatFs(dir.getAbsolutePath());
int sdkInt = Build.VERSION.SDK_INT;
long totalBytes;
long availableBytes;
if (sdkInt < Build.VERSION_CODES.JELLY_BEAN_MR2) {
int blockSize = statFs.getBlockSize();
availableBytes = ((long) statFs.getAvailableBlocks()) * blockSize;
totalBytes = ((long) statFs.getBlockCount()) * blockSize;
} else {
availableBytes = statFs.getAvailableBytes();
totalBytes = statFs.getTotalBytes();
}
// Target at least 90% of available or 25% of total space
size = (long) Math.min(availableBytes * MAX_AVAILABLE_SPACE_USE_FRACTION, totalBytes * MAX_TOTAL_SPACE_USE_FRACTION);
} catch (IllegalArgumentException ignored) {
// ignored
}
return size;
}
Run Code Online (Sandbox Code Playgroud)
基于此答案,添加了对Android版本<18的支持
public static float megabytesAvailable(File file) {
StatFs stat = new StatFs(file.getPath());
long bytesAvailable;
if(Build.VERSION.SDK_INT >= 18){
bytesAvailable = getAvailableBytes(stat);
}
else{
//noinspection deprecation
bytesAvailable = stat.getBlockSize() * stat.getAvailableBlocks();
}
return bytesAvailable / (1024.f * 1024.f);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private static long getAvailableBytes(StatFs stat) {
return stat.getBlockSizeLong() * stat.getAvailableBlocksLong();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48597 次 |
| 最近记录: |