Android SDK を介して Android デバイス (SD カードではなく) の空きメモリ量を取得することはできますか?
もしそうなら、どのように?
この投稿はあなたの質問にぴったりかもしれません。
このスレッドもチェックしてください。ここにはSOに関する多くの情報があります。
少しグーグルして、ここに解決策があります(android gitにあります)
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);
/*************************************************************************************************
Returns size in bytes.
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 = ( (long) statFs.getBlockCount() * (long) statFs.getBlockSize());
return Total;
}
public long FreeMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Free = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
return Free;
}
public long BusyMemory()
{
StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long Total = ((long) statFs.getBlockCount() * (long) statFs.getBlockSize());
long Free = (statFs.getAvailableBlocks() * (long) statFs.getBlockSize());
long Busy = Total - Free;
return Busy;
}
バイトを人間が読める形式 (1 Mb、1 Gb など) に変換する
public static String floatForm (double d)
{
return new DecimalFormat("#.##").format(d);
}
public static String bytesToHuman (long size)
{
long Kb = 1 * 1024;
long Mb = Kb * 1024;
long Gb = Mb * 1024;
long Tb = Gb * 1024;
long Pb = Tb * 1024;
long Eb = Pb * 1024;
if (size < Kb) return floatForm( size ) + " byte";
if (size >= Kb && size < Mb) return floatForm((double)size / Kb) + " Kb";
if (size >= Mb && size < Gb) return floatForm((double)size / Mb) + " Mb";
if (size >= Gb && size < Tb) return floatForm((double)size / Gb) + " Gb";
if (size >= Tb && size < Pb) return floatForm((double)size / Tb) + " Tb";
if (size >= Pb && size < Eb) return floatForm((double)size / Pb) + " Pb";
if (size >= Eb) return floatForm((double)size / Eb) + " Eb";
return "???";
}
StatFs
クラスはあなたが使用する必要があるものかもしれないようです。どのパスがデバイスのルートと見なされるかはわかりませんが、内部ストレージの一部である限り、ディレクトリに関係なく結果は同じになると思います。このようなものが機能する可能性があります:
StatFs stats = new StatFs("/data");
int availableBlocks = stats.getAvailableBlocks();
int blockSizeInBytes = stats.getBlockSize();
int freeSpaceInBytes = availableBlocks * blockSizeInBytes;
他に何もないとしても、StatFsクラスはどこを見ればよいかについての良いスタートを与えるはずです。
2013 年以降、Google によって廃止されたメソッドがいくつかあります。これらのメソッドを変更できます (API 18 以降のみ)。
getAvailableBlocks()
にgetAvailableBlocksLong()
getBlockCount()
にgetBlockCountLong()
getBlockSize()
にgetBlockSizeLong()
getFreeBlocks()
にgetFreeBlocksLong()
/**
* @return Number of bytes available on internal storage
*/
public static long getInternalAvailableSpace() {
long availableSpace = -1L;
try {StatFs stat = new StatFs(Environment.getDataDirectory()
.getPath());
stat.restat(Environment.getDataDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
e.printStackTrace();
}
return availableSpace;
}
内部メモリ サイズが非常に大きいデバイスでは、int 値が小さすぎるため機能しません。たとえば、Motorola xum では機能しません。次のようなものを使用する必要があります。
int freeSpaceInKilobytes = availableBlocks * (blockSizeInBytes / 1024);