Chcę programowo uzyskać rozmiar wolnej pamięci w pamięci wewnętrznej / zewnętrznej mojego urządzenia. Używam tego fragmentu kodu:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);
File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format = Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);
a wynik jaki otrzymuję to:
11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB
Problem polega na tym, że chcę uzyskać wolną pamięć SdCard, która jest 1,96GB
teraz. Jak mogę naprawić ten kod, aby uzyskać darmowy rozmiar?
android
android-sdcard
diskspace
Android-Droid
źródło
źródło
Odpowiedzi:
Poniżej znajduje się kod do Twojego celu:
Uzyskaj rozmiar pamięci RAM
źródło
getBlockSize()
igetBlockCount
są przestarzałe.Tak to zrobiłem:
źródło
getBlockSize
igetAvailableBlocks
zgetBlockSizeLong
agetAvailableBlocksLong
.Od API 9 możesz:
źródło
File.getUsableSpace()
wygląda łatwiejszy sposób używać zamiast używaćStatFs
. Dlaczego miałbym używaćStatFs
@MarkCarter?Aby uzyskać wszystkie dostępne foldery pamięci (w tym karty SD), najpierw pobierz pliki pamięci:
Następnie możesz uzyskać dostępny rozmiar każdego z nich.
Można to zrobić na 3 sposoby:
API 8 i starsze:
API 9 i nowsze:
API 18 i nowsze (niepotrzebne, jeśli poprzedni jest w porządku):
Aby uzyskać ładnie sformatowany ciąg tego, co masz teraz, możesz użyć:
lub możesz użyć tego w przypadku, gdy chcesz zobaczyć dokładną liczbę bajtów, ale ładnie:
Zwróć uwagę, że myślę, że pamięć wewnętrzna może być taka sama jak pierwsza pamięć zewnętrzna, ponieważ pierwsza jest emulowana.
EDYCJA: Używając StorageVolume na Androidzie Q i nowszych, myślę, że można uzyskać wolne miejsce dla każdego, używając czegoś takiego:
Nie jestem pewien, czy to prawda i nie mogę znaleźć sposobu, aby uzyskać całkowity rozmiar każdego z nich, więc napisałem o tym tutaj i zapytałem o to tutaj .
źródło
@ Android-Droid - mylisz się co
Environment.getExternalStorageDirectory()
do pamięci zewnętrznej, która nie musi być kartą SD, może być też zamontowana pamięć wewnętrzna. Widzieć:Znajdź lokalizację zewnętrznej karty SD
źródło
Wypróbuj ten prosty fragment
źródło
java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648
błąd wydaje się żedigitGroups
wynik to -2147483648.Znalezienie dostępnej pamięci masowej jest bardzo łatwe, jeśli masz zarówno wewnętrzną, jak i zewnętrzną ścieżkę pamięci. Również zewnętrzna ścieżka pamięci telefonu jest naprawdę łatwa do znalezienia
Koncentruję się więc tylko na tym, jak znaleźć ścieżki zewnętrznej pamięci wymiennej, takiej jak wymienna karta SD, USB OTG (nie testowane USB OTG, ponieważ nie mam USB OTG).
Poniższa metoda poda listę wszystkich możliwych zewnętrznych ścieżek pamięci wymiennej.
źródło
Szybki dodatek do tematu Pamięć zewnętrzna
Nie daj się zmylić nazwą metody
externalMemoryAvailable()
w odpowiedzi Dinesha Prajapatiego.Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
podaje aktualny stan pamięci, jeśli nośnik jest obecny i zamontowany w punkcie montowania z dostępem do odczytu / zapisu. Dostaniesztrue
nawet na urządzeniach bez kart SD, takich jak Nexus 5. Ale nadal jest to metoda obowiązkowa przed jakąkolwiek operacją z pamięcią masową.Aby sprawdzić, czy w urządzeniu jest karta SD, możesz użyć metody
ContextCompat.getExternalFilesDirs()
Nie pokazuje urządzeń przejściowych, takich jak dyski flash USB.
Należy również pamiętać, że
ContextCompat.getExternalFilesDirs()
na Androidzie 4.3 i niższych zawsze zwróci tylko 1 wpis (karta SD, jeśli jest dostępna, w przeciwnym razie wewnętrzna). Więcej na ten temat przeczytasz tutaj .w moim przypadku wystarczyło, ale nie zapominaj, że niektóre urządzenia z Androidem mogą mieć 2 karty SD, więc jeśli potrzebujesz ich wszystkich - dostosuj powyższy kod.
źródło
Klasa StorageStatsManager wprowadziła system Android O i nowszy, który może zapewnić bezpłatny i całkowity bajt w pamięci zewnętrznej / wewnętrznej. Aby uzyskać szczegółowe informacje o kodzie źródłowym, możesz przeczytać mój następujący artykuł. możesz użyć refleksji na niższych niż Android O.
https://medium.com/cashify-engineering/how-to-get-storage-stats-in-android-o-api-26-4b92eca6805b
źródło
Tak to zrobiłem ...
pamięć wewnętrzna Total
Wolny rozmiar wewnętrzny
Zewnętrzna pamięć wolna i całkowita
źródło
Jeśli chodzi o menorię zewnętrzną, jest inny sposób:
File external = Environment.getExternalStorageDirectory(); free:external.getFreeSpace(); total:external.getTotalSpace();
źródło
Po sprawdzeniu różnych rozwiązań napisz kod samodzielnie, to jest kompletny kod do znalezienia
'' ''
źródło