2016-09-29 6 views
6

모두 환영합니다안드로이드에서 SD 카드 크기를 얻을 수있는 방법이 있습니까?

나는 이것에 관련된 모든 질문을 Stackoverflow와 google에서 시도했지만 그 중 아무 것도 작동하지 않습니다. 다음 링크와 같은 것을 시도했지만 내부 저장소와 동일한 값을 반환합니다. How to get an External storage sd card size (With Mounted SD card)?

예를 들어, 사용하는 방법에 관계없이 내부 저장 용량이 약 12GB이고 SD 카드 저장 용량이 약 12GB 인 경우, 항상 내부 공간에 대해하는 것처럼 SD 공간에 대한 정확한 숫자.

Stackoverflow에 게시 된 이전 방법은 Android KitKat까지만 작동하지만 다음 Android 버전에서는 작동하지 않는 것으로 보입니다.

이 문제를 해결할 수 있습니까?

+1

잘 사용하셨습니까? 게시 한 코드는 SD 카드와 아무 관련이 없습니다. – greenapps

+0

@ greenapps 20 개의 솔루션을 스택에 넣은 것처럼 tryed했습니다. 그들 모두를 기억할 수는 없다. 단순히 그들 모두를 tryed. 그들 중 누구도 4.4 kitkat 이후로 일하지 않습니다. 작동하는 솔루션을 알고 있습니까? – NullPointerException

+0

나는 당신이 시도한 것을 모른다. 그리고 당신은 당신이 SD 카드로 가져간 경로를 말하지 않았습니다. 네가 그 길을 말했을 뿐이야. – greenapps

답변

3

좋아, 나는 항상 이것을 궁금해하고 온라인에서 답을 찾을 수 없었다. 그래서 여기에 내가하는 일이 있습니다. 그것은 너무 깨끗하지 않을 수도 있지만 그것은 매번 저를 위해 일합니다.

내 경우 : 61,055MB를 반환합니다. 64GB sd 카드를 삽입했습니다.

아, 그리고 내가 언급하는 것을 잊었다 : 나는 확인 5.1.1 오늘 삼성 갤럭시 S5 6.0소니 엑스 페리아 Z5 프리미엄에 이런 짓을. 그러나, 나는 또한 매일 수백 명의 사람들이 사용하는 앱을 가지고 있으며 아직 어떤 문제도 경험하지 못했습니다.

@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

그것이 작동하는 것 감사합니다. – NullPointerException

+0

기꺼이 도와 드리겠습니다. 그것은 이것이 매우 일반적인 질문이 아닌 방법에있어서 놀랍습니다. –

+0

감사합니다. <3 –

0

휴대 전화에는 32GB의 내장 메모리와 15GB의 SD 카드가 있습니다. /mnt/sdcarddf을 입력하면 32GB의 결과가 나오는데 이는 우리가 찾고있는 결과가 아닙니다. 더 파고 들자면,이 /storage 디렉토리를 찾았습니다. 그것은 3 개가에있는 파일이 있습니다 각 항목에 df을하고

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

을 다음과 제공 :

[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 

나는 마법의 명령 mFilesArray[]ls /storage의 결과입니다 "df /storage/" + mFilesArray[0] 생각합니다.

(의 구글의 사람들은 SD 카드 내가 의심 미래, 마운트 지점을 변경하지 않는 것이 희망하자.)이 도움이

희망.