外部ストレージでスペースの可用性を確認する方法は?
-
02-10-2019 - |
質問
SDカードがいっぱいであるかどうかを確認するには、アプリケーションがジョブを実行し続けることができるかどうかを判断して、外部ストレージに書き込み、ストレージがスペースがなくなっていることをユーザーに通知します。
解決 3
使用する StatFs
外部ストレージディレクトリのパスをコンストラクターに渡すと、次のような関数を呼び出すことができます getAvailableBlocks()
と getBlockSize()
に StatFs
物体。
他のヒント
新しいデバイスで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;
STATFには、交換方法が返されます long
, getAvailableBlocksLong()
と getBlockCountLong()
, 、しかし問題は、それらが追加されただけであるということです APIレベル18.
代わりにこれを使用してください
最も簡単な方法は使用することです getFreeSpace()
java.io.fileで, 、APIレベル9に追加され、戻ります long
:
このパスを含むパーティションの自由バイト数を返します。このパスが存在しない場合は0を返します。
したがって、外部ストレージの空きスペースを取得するには(「SDカード」):
File externalStorageDir = Environment.getExternalStorageDirectory();
long free = externalStorageDir.getFreeSpace() / 1024 / 1024;
あるいは、もしあなたの場合 本当 STATFを使用したいが、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;
}
このステートメントを使用して問題に関連することができると思います。これにより、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;
}
内部ストレージサイズを取得する方法は次のとおりです。
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long blockSize = statFs.getBlockSize();
long totalSize = statFs.getBlockCount()*blockSize;
long availableSize = statFs.getAvailableBlocks()*blockSize;
long freeSize = statFs.getFreeBlocks()*blockSize;
外部ストレージサイズ(SDカードサイズ)を取得する方法は次のとおりです。
StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
long blockSize = statFs.getBlockSize();
long totalSize = statFs.getBlockCount()*blockSize;
long availableSize = statFs.getAvailableBlocks()*blockSize;
long freeSize = statFs.getFreeBlocks()*blockSize;