2016-09-29 47 views
6

Powitanie wszystkieCzy istnieje sposób na pobranie rozmiaru karty SD w systemie Android?

Próbowałem każde pytanie związane z tym w Stackoverflow i google i żaden z nich nie działa. Próbowałem czegoś podobnego do tego następnego linku, ale zwraca to samo, co pamięć wewnętrzna: How to get an External storage sd card size (With Mounted SD card)?

Na przykład, jeśli mam około 12 GB pamięci wewnętrznej i 4 GB pamięci SD, niezależnie od używanej przeze mnie metody, zawsze otrzymuję dokładnie taką samą liczbę dla przestrzeni SD, jak ja dla przestrzeni wewnętrznej.

Wygląda na to, że stare metody opublikowane tutaj w Stackoverflow działają tylko do Androida KitKat, ale nie działają w kolejnych wersjach Androida.

Czy można rozwiązać ten problem?

+1

Z której ścieżki korzystałeś? Kod, który wysłałeś, nie ma nic wspólnego z kartą SD. – greenapps

+0

@greenapps Próbowałem jak 20 rozwiązań opublikowanych w stosie. Nie pamiętam ich wszystkich. Po prostu wypróbowałeś je wszystkie. Żadna z nich nie działa od wersji 4.4 KitKat. Czy znasz rozwiązanie, które działa? – NullPointerException

+0

Nie wiem, co próbowałeś. I nie powiedziałeś, którą ścieżkę wybrałeś dla karty SD. Gdybyś tylko wskazał ścieżkę. – greenapps

Odpowiedz

3

OK, zawsze się nad tym zastanawiałem i nie mogłem znaleźć odpowiedzi w Internecie. Oto co robię. To może nie być tak czyste, ale działa dla mnie za każdym razem.

Dla mojej sprawy: zwraca 61 055 MB. Mam włożoną kartę SD o pojemności 64 GB.

No i zapomniałem wspomnieć: Zrobiłem to na Samsung Galaxy S5 6.0 i Sony Xperia Z5 Premium 5.1.1 dzisiaj, aby potwierdzić. Jednak mam też aplikację, z której korzysta kilkaset osób dziennie i nie doświadczyłem jeszcze żadnych problemów.

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
static String getExternalSdCardSize() { 
    File storage = new File("/storage"); 
    String external_storage_path = ""; 
    String size = ""; 

    if (storage.exists()) { 
     File[] files = storage.listFiles(); 

     for (File file : files) { 
      if (file.exists()) { 
       try { 
        if (Environment.isExternalStorageRemovable(file)) { 
         // storage is removable 
         external_storage_path = file.getAbsolutePath(); 
         break; 
        } 
       } catch (Exception e) { 
        Log.e("TAG", e.toString()); 
       } 
      } 
     } 
    } 

    if (!external_storage_path.isEmpty()) { 
     File external_storage = new File(external_storage_path); 
     if (external_storage.exists()) { 
      size = totalSize(external_storage); 
     } 
    } 
    return size; 
} 

private static String totalSize(File file) { 
    StatFs stat = new StatFs(file.getPath()); 
    long blockSize, totalBlocks; 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     blockSize = stat.getBlockSizeLong(); 
     totalBlocks = stat.getBlockCountLong(); 
    } else { 
     blockSize = stat.getBlockSize(); 
     totalBlocks = stat.getBlockCount(); 
    } 

    return formatSize(totalBlocks * blockSize); 
} 

private static String formatSize(long size) { 
    String suffix = null; 

    if (size >= 1024) { 
     suffix = "KB"; 
     size /= 1024; 
     if (size >= 1024) { 
      suffix = "MB"; 
      size /= 1024; 
     } 
    } 

    StringBuilder resultBuilder = new StringBuilder(Long.toString(size)); 

    int commaOffset = resultBuilder.length() - 3; 
    while (commaOffset > 0) { 
     resultBuilder.insert(commaOffset, ','); 
     commaOffset -= 3; 
    } 

    if (suffix != null) resultBuilder.append(suffix); 
    return resultBuilder.toString(); 
} 
+1

dziękuję, wydaje się działać. – NullPointerException

+0

Cieszę się, że mogę pomóc. Zaskakuje mnie, jak to nie jest typowe pytanie. –

+0

Dzięki za banda! <3 –

0

Mój telefon ma wbudowaną pamięć 32 GB i kartę SD o pojemności 15 GB. Wykonanie df na /mnt/sdcard daje wynik 32 GB, który nie jest tym, czego szukamy. Kopiąc dalej, znalazłem ten katalog /storage. Posiada 3 pliki tam:

[email protected]:/storage $ ls 
8E5D-12E2 
emulated 
self 

robi df na każdej pozycji, wydaje następujący:

[email protected]:/storage $ df self             
Filesystem    Size  Used  Free Blksize 
self     889.4M  0.0K 889.4M 4096 
[email protected]:/storage $ df emulated            
Filesystem    Size  Used  Free Blksize 
emulated    22.6G 10.8G 11.8G 4096 
[email protected]:/storage $ df 8E5D-12E2/           
Filesystem    Size  Used  Free Blksize 
8E5D-12E2/    14.9G  2.3G 12.7G 32768 

myślę magiczne polecenie jest "df /storage/" + mFilesArray[0] gdzie mFilesArray[] wynika z ls /storage.

(Miejmy nadzieję, że Google faceci nie zmieniają karty SD punkt montowania w przyszłości, w co wątpię).

Nadzieja to pomaga.