2013-05-30 9 views
9

Link :I worked on based on this LinkWie bekomme ich eine externe Speicher SD-Karte Größe (mit Mounted SD-Karte)?

Ich habe diese Linie um die Größe zu finden (intern und extern) Größe,

return availableExternalMemorySize/(1024*1024); 

ich in meinem Tablet getestet. Ich erhalte die interne und externe SD-Karte Größe wie

In Interner Speicher:

  1. Total Memory --1007
  2. verfügbarer Speicher --683

In Externer Speicher:

  1. Gesamtspeicher - 1763
  2. Av ailable Speicher - 1554

Aber in Tablet sah ich Einstellungen. Eine externe Speichergröße hat 8 GB. Aber es zeigt mir 1,7 GB herum, wenn ich über Programm getestet habe.

Wie wird eine externe Speichergröße ermittelt?

Antwort

13

auf die externe SD-Karte verfügbar „freien“ Raum erhalten eine Nummer, die mit der Menü-> Einstellungen-> SD-Karte und Telefonspeicher Nummer stimmt zu zeigen, verwenden Sie den folgenden Code ein:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); 
double sdAvailSize = (double)stat.getAvailableBlocks() 
        * (double)stat.getBlockSize(); 
//One binary gigabyte equals 1,073,741,824 bytes. 
double gigaAvailable = sdAvailSize/1073741824; 

Hier wie Sie interne Speichergrößen erhalten:

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; 

Hier ist, wie Sie externe Speichergrößen (SD-Format) erhalten:

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; 

Kurzinformation

Freie Blöcke:

Die Gesamtzahl der Blöcke, die frei auf dem Dateisystem, einschließlich reservierten Blöcke (die zu normalen Anwendungen nicht verfügbar sind) .

Verfügbare Blöcke:

Die Anzahl der Blöcke, die Anwendungen auf das Dateisystem und kostenfrei zur Verfügung stehen.


Hier ist, wie zu erkennen, ob SD-Karte montiert ist:

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 
} 

Relevante Dokumentation: http://developer.android.com/reference/android/os/StatFs.html

+0

interessante Erklärung, sehr hilfreich – Dimitri

+2

Ich bin hergekommen, als 'getAvailableBlocks()' ist veraltet verwenden. Es funktioniert nicht ab KitKat. Es scheint, dass diese Werte negativ sind, wenn die Größe zu groß ist. Also, es wird vorgeschlagen, 'getAvailableBlocksLong()' zu verwenden. – msysmilu

+0

Ist ** freeSize ** in MB oder Bytes? –

0

Damit die deprecation und Quer Verfügbarkeit zu erklären, ich habe machte diese Methoden.

public static long sdCardFree_bytes() { 
    File path  = Environment.getExternalStorageDirectory(); 
    StatFs stat  = new StatFs(path.getPath()); 
    long free_memory = 0; //return value is in bytes 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     free_memory = stat.getAvailableBlocksLong() * stat.getBlockSizeLong(); 
    } else { 
     free_memory = stat.getAvailableBlocks() * stat.getBlockSize(); 
    } 

    return free_memory; 
} 

public static long sdCardUsed_bytes() { 

    File path  = Environment.getExternalStorageDirectory(); 
    StatFs stat  = new StatFs(path.getPath()); 
    long free_memory = 0; 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     free_memory = (stat.getBlockCountLong() - stat.getAvailableBlocksLong()) * stat.getBlockSizeLong(); //return value is in bytes 
    } else { 
     free_memory = (stat.getBlockCount() - stat.getAvailableBlocks()) * stat.getBlockSize(); //return value is in bytes 
    } 

    return free_memory; 
} 

public static long sdCardTotal_bytes() { 

    File path  = Environment.getExternalStorageDirectory(); 
    StatFs stat  = new StatFs(path.getPath()); 
    long free_memory = 0; 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     free_memory = stat.getBlockCountLong() * stat.getBlockSizeLong(); //return value is in bytes 
    } else { 
     free_memory = stat.getBlockCount() * stat.getBlockSize(); //return value is in bytes 
    } 

    return free_memory; 
}