Как проверить, сколько свободного места на SD-карте, установленной на устройстве Android? - PullRequest
33 голосов
/ 31 мая 2010

Как программно проверить, сколько свободного места есть на SD-карте, установленной на устройстве Android?

Ответы [ 5 ]

80 голосов
/ 22 февраля 2011

Чтобы получить доступное «свободное» место на внешней SD-карте для отображения номера, который соответствует номеру Меню-> Настройки-> SD-карта и память телефона, используйте следующий код:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
double sdAvailSize = (double)stat.getAvailableBlocks()
                   * (double)stat.getBlockSize();
//One binary gigabyte equals 1,073,741,824 bytes.
double gigaAvailable = sdAvailSize / 1073741824;

Соответствующая документация: http://developer.android.com/reference/android/os/StatFs.html

13 голосов
/ 03 апреля 2012
/**
 * This class is designed to get available space in external storage of android. 
 * It contains methods which provide you the available space in different units e.g
 * bytes, KB, MB, GB. OR you can get the number of available blocks on external storage.
 *
 */
public class AvailableSpaceHandler {

    //*********
    //Variables
    /**
     * Number of bytes in one KB = 2<sup>10</sup>
     */
    public final static long SIZE_KB = 1024L;

    /**
     * Number of bytes in one MB = 2<sup>20</sup>
     */
    public final static long SIZE_MB = SIZE_KB * SIZE_KB;

    /**
     * Number of bytes in one GB = 2<sup>30</sup>
     */
    public final static long SIZE_GB = SIZE_KB * SIZE_KB * SIZE_KB;

    //********
    // Methods

    /**
     * @return Number of bytes available on external storage
     */
    public static long getExternalAvailableSpaceInBytes() {
        long availableSpace = -1L;
        try {
            StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
            availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return availableSpace;
    }


    /**
     * @return Number of kilo bytes available on external storage
     */
    public static long getExternalAvailableSpaceInKB(){
        return getExternalAvailableSpaceInBytes()/SIZE_KB;
    }
    /**
     * @return Number of Mega bytes available on external storage
     */
    public static long getExternalAvailableSpaceInMB(){
        return getExternalAvailableSpaceInBytes()/SIZE_MB;
    }

    /**
     * @return gega bytes of bytes available on external storage
     */
    public static long getExternalAvailableSpaceInGB(){
        return getExternalAvailableSpaceInBytes()/SIZE_GB;
    }

    /**
     * @return Total number of available blocks on external storage
     */
    public static long getExternalStorageAvailableBlocks() {
        long availableBlocks = -1L;
        try {
            StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
            availableBlocks = stat.getAvailableBlocks();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return availableBlocks;
    }
}
10 голосов
/ 13 июня 2014

Вот более простой способ, который можно использовать начиная с уровня API 9:

Environment.getExternalStorageDirectory().getUsableSpace();

http://developer.android.com/reference/java/io/File.html#getUsableSpace()

2 голосов
/ 01 мая 2015

Этот код работает для меня:

StatFs stat = new StatFs(System.getenv("SECONDARY_STORAGE"));

long bytesAvailable = (long)stat.getBlockSize() * (long)stat.getAvailableBlocks();

long kiloAvailable = bytesAvailable / 1024; // Available space from SD in KB
long megaAvailable = bytesAvailable / (1024*1024); // Available space from SD in MB

return (int)kiloAvailable; 
0 голосов
/ 10 июня 2015
public static float megabytesAvailable(String  StrPath) {
  StatFs stat = new StatFs(StrPath);

  long bytesAvailable = (long)stat.getBlockSize() * (long)stat.getAvailableBlocks();
  return bytesAvailable / (1024.f * 1024.f);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...