2016-09-29 23 views
6

Chào mừng tất cảCó cách nào để có được kích thước thẻ SD trong Android không?

Tôi đã thử mọi câu hỏi liên quan đến điều này trong Stackoverflow và google và không có câu hỏi nào trong số đó hoạt động. Tôi đã thử một cái gì đó như thế này liên kết tiếp theo, nhưng nó trả về giống như lưu trữ nội bộ: How to get an External storage sd card size (With Mounted SD card)?

Ví dụ, nếu tôi có khoảng 12GB bộ nhớ trong và lưu trữ thẻ SD 4GB, cho dù tôi sử dụng phương pháp gì, tôi luôn nhận được chính xác cùng một số cho không gian SD như tôi làm cho không gian nội bộ.

Dường như các phương pháp cũ được đăng ở đây trong Stackoverflow chỉ hoạt động cho đến Android KitKat nhưng không hoạt động trong các phiên bản Android tiếp theo.

Có thể giải quyết vấn đề này không?

+1

Bạn đã sử dụng đường dẫn nào? Mã bạn đăng không liên quan gì đến thẻ sd. – greenapps

+0

@greenapps tôi đã thử như 20 giải pháp được đăng trong ngăn xếp. Không thể nhớ tất cả chúng. Chỉ cần thử tất cả chúng. Không ai trong số họ hoạt động kể từ 4.4 kitkat. Bạn có biết một giải pháp hoạt động không? – NullPointerException

+0

Tôi không biết những gì bạn đã thử. Và bạn đã không nói cho con đường bạn đã lấy cho thẻ sd. Nếu bạn chỉ nói với con đường. – greenapps

Trả lời

3

Ok, tôi đã luôn tự hỏi điều này và không thể tìm thấy câu trả lời trực tuyến. Vì vậy, đây là những gì tôi làm. Nó có thể không được sạch sẽ như vậy nhưng nó hoạt động cho tôi mỗi lần.

Đối với trường hợp của tôi: nó trả về 61,055 MB. Tôi đã lắp thẻ SD 64 GB.

Oh và tôi quên đề cập đến: Tôi đã làm điều này trên Samsung Galaxy S5 6.0Sony Xperia Z5 cao cấp 5.1.1 ngày hôm nay để xác nhận. Tuy nhiên, tôi cũng có một ứng dụng mà hàng trăm người sử dụng hàng ngày và tôi chưa gặp phải bất kỳ vấn đề nào.

@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

cảm ơn bạn dường như nó hoạt động. – NullPointerException

+0

Vui vì tôi có thể giúp. Thật ngạc nhiên với tôi làm thế nào đây không phải là một câu hỏi rất phổ biến –

+0

Cảm ơn một bó! <3 –

0

Điện thoại của tôi có bộ nhớ trong 32GB và thẻ SD 15 GB. Làm một số df trên /mnt/sdcard cho kết quả 32 GB, đó không phải là những gì chúng tôi đang tìm kiếm. Đào sâu hơn, tôi tìm thấy thư mục /storage này. Nó có 3 file trong đó:

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

làm một df trên từng hạng mục cho phép như sau:

[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 

Tôi nghĩ rằng lệnh diệu là "df /storage/" + mFilesArray[0] nơi mFilesArray[] là kết quả từ ls /storage.

(Hãy hy vọng rằng Google chàng trai không thay đổi SD Card gắn kết điểm trong tương lai, mà tôi nghi ngờ.)

Hope this helps.

Các vấn đề liên quan