12

私の知る限り、Androidには次のものがあります。

  • アプリとキャッシュ用の内部メモリ
  • 一部の電話の内蔵 SD カード (取り外し不可)
  • 音楽と写真用の外付け SD カード (リムーバブル)

それらが存在することを確認して、それぞれの合計と使用可能を取得するにはどうすればよいですか (一部の電話には内蔵 SD カードがありません)

ありがとう

4

5 に答える 5

33

内部ストレージのサイズを取得する方法は次のとおりです。

 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;

短いメモ

フリーブロック:

予約済みブロック (通常のアプリケーションでは使用できない) を含む、ファイル システムで空いているブロックの総数。

利用可能なブロック:

ファイル システム上で空きがあり、アプリケーションで使用できるブロックの数。


SD カードがマウントされているかどうかを検出する方法は次のとおりです。

 String state = Environment.getExternalStorageState();
 if (Environment.MEDIA_MOUNTED.equals(state)) 
 {
   // We can read and write the media    
 } 
 else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
 {
    // We can only read the media     
 } 
 else 
 {
    // No external media
 }
于 2011-01-25T22:56:53.283 に答える
3
/*************************************************************************************************
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 int TotalMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        int Total = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        return Total;
    }

    public int FreeMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());
        int Free  = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        return Free;
    }

    public int BusyMemory()
    {
        StatFs statFs = new StatFs(Environment.getRootDirectory().getAbsolutePath());   
        int Total = (statFs.getBlockCount() * statFs.getBlockSize()) / 1048576;
        int Free  = (statFs.getAvailableBlocks() * statFs.getBlockSize()) / 1048576;
        int Busy  = Total - Free;
        return Busy;
    }
于 2012-01-11T20:23:42.720 に答える
3

内部メモリの場合、 Environment.getRootDirectory().getAbsolutePath() は正しいアプローチではありません。

また、ほとんどのデバイスで

Environment.getDataDirectory() は機能しますが、やはり一貫性がありません。

外部ディレクトリのアプローチは正しいです。内部 mnt/sdcard の使用を区別するには

Environment.isExternalStorageRemovable()。

しかし、正確な内部メモリを取得する方法についてはまだ疑問に思っています。オープン ソースの不一致と多くのバージョンと同様に。

于 2012-12-18T23:23:17.090 に答える
0

StatFs - ファイルシステムのスペースに関する全体的な情報を取得します. これは Unix statvfs() のラッパーです。

API レベル 18 以降の使用

long getTotalBytes - The total number of bytes supported by the file system. 

古い API を使用する場合

int getBlockCount ()
int getBlockSize ()

StatFs stat = new StatFs(**path**);
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();

ここでは、パス変数に正しい文字列値を提供する必要があります。次のようなパスの文字列値を使用する必要があります: "/mnt/external_sd/" "/mnt/extSdCard/"

すべての/mnt/デバイスのリストを取得して、この値のいずれかを使用できます。

File mntDir = new File("/mnt/");
if(mntDir.isDirectory()){ 
String[] dirList = mntDir.list();...}

または何かのような

var file=new Java.IO.File("storage/");
var listOfStorages=file.ListFiles();

また

String[] externals = System.getenv("SECONDARY_STORAGE").split(":");
于 2018-04-01T23:14:22.047 に答える