如何检查Android设备上的可用空间?在SD卡上?

Zeu*_*eus 46 java android

我如何检查Android设备上剩下多少MB或GB?我正在使用JAVA和android SDK 2.0.1.

是否有任何系统服务会暴露这样的事情?

小智 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)

上面的代码引用了截至2014年8月13日的一些已弃用的函数.我在下面重现了更新版本:

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)

  • 是的,getBlockSize()已弃用.我们还可以使用Environment.getDataDirectory().getUsableSpace()来检索可用空间. (4认同)

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)

  • 现在不推荐使用`getBlockSize`和`getBlockCount`.请改用`stat.getBlockSizeLong()*stat.getBlockCountLong()`. (7认同)
  • 此代码中唯一未弃用的部分是“System.out.println” (3认同)
  • 正如Joe Wreschning所说,这找到了SD卡的大小 (2认同)
  • 请参考乔的下面的答案. (2认同)

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)

  • 发现重复太多了。很好的代码,但它可以变得更小。 (2认同)

and*_*per 5

另外,如果要检查内部存储器的可用空间,请使用:

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
Run Code Online (Sandbox Code Playgroud)

...


fad*_*a21 5

自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)


Ily*_*man 5

基于答案,添加了对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 次

最近记录:

7 年,2 月 前