SD カードがいっぱいかどうかを確認して、アプリケーションがジョブを続行できるかどうか、つまり外部ストレージに書き込むか、ストレージの容量が不足していることをユーザーに通知できるかを判断するにはどうすればよいですか。
6 に答える
新しいデバイスでは 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 にはlong
、getAvailableBlocksLong()
とを返す代替メソッドがありますが、問題は、それらが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;
/******************************************************************************************
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;
}
StatFs
外部ストレージディレクトリのパスを使用してコンストラクタに渡すgetAvailableBlocks()
とgetBlockSize()
、StatFs
オブジェクトなどの関数を呼び出すことができます。
このステートメントを使用して問題を解決できると思います。これは、SDカードの容量が十分かどうかを確認できません。
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
//to do something in here
}
/**
* @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;
}