16

SD カードがいっぱいかどうかを確認して、アプリケーションがジョブを続行できるかどうか、つまり外部ストレージに書き込むか、ストレージの容量が不足していることをユーザーに通知できるかを判断するにはどうすればよいですか。

4

6 に答える 6

15

新しいデバイスでは StatFs と int オーバーフローに注意してください

この回答 のアプローチは、大規模な外部ストレージを備えたデバイスでは機能しません。たとえば、私の Nexus 7 では、実際には最大 10 GB のスペースが残っているにもかかわらず、現在は最大 2 GB を返します。

// DOES NOT WORK CORRECTLY ON DEVICES WITH LARGE STORAGE DUE TO INT OVERFLOW
File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDirectory.getAbsolutePath());  
int free = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1024 / 1024;

StatFs にはlonggetAvailableBlocksLong()とを返す代替メソッドがありますが、問題は、それらがAPI レベル 18getBlockCountLong()でのみ追加されたことです。

代わりにこれを使用してください

最も簡単な方法は、API レベル 9 で追加されgetFreeSpace()た java.io.Filelongで使用することです。

このパスを含むパーティションの空きバイト数を返します。このパスが存在しない場合は 0 を返します。

したがって、外部ストレージ (「SD カード」) の空き容量を取得するには:

File externalStorageDir = Environment.getExternalStorageDirectory();
long free = externalStorageDir.getFreeSpace() / 1024 / 1024;

または、本当にStatFs を使用したいが API レベル 18 未満をサポートする必要がある場合は、これで整数オーバーフローが修正されます。

File externalStorageDir = Environment.getExternalStorageDirectory();
StatFs statFs = new StatFs(externalStorageDir.getAbsolutePath());  
long blocks = statFs.getAvailableBlocks();
long free = (blocks * statFs.getBlockSize()) / 1024 / 1024;
于 2014-01-17T09:29:06.380 に答える
13
/******************************************************************************************
Returns size in MegaBytes.

If you need calculate external memory, change this: 
   StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
to this: 
   StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());

******************************************************************************************/
    public long totalMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   total  = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        return total;
    }

    public long freeMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
        long   free   = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        return free;
    }

    public long busyMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        long   total  = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        long   free   = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        long   busy   = total - free;
        return busy;
    }
于 2012-01-11T20:51:27.703 に答える
8

StatFs外部ストレージディレクトリのパスを使用してコンストラクタに渡すgetAvailableBlocks()getBlockSize()StatFsオブジェクトなどの関数を呼び出すことができます。

于 2010-07-09T10:35:01.337 に答える
4

このステートメントを使用して問題を解決できると思います。これは、SDカードの容量が十分かどうかを確認できません。

if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
    //to do something in here
}
于 2010-07-02T03:31:00.450 に答える
0
/**
 * @return Number of bytes available on external storage
 */
public static long getExternalStorageAvailableSpace() {
    long availableSpace = -1L;
    try {
        StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
                .getPath());
        stat.restat(Environment.getExternalStorageDirectory().getPath());
        availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return availableSpace;
}
于 2012-04-03T05:07:19.847 に答える