質問

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top