2013-04-28 2 views
2

SOF 및 Android 개발자 사이트에서 getExternalStorageDirectory() 메소드를 찾을 수 있었지만 휴대 전화에 마운트 된 SD 카드의 여유 공간을 찾을 수있는 방법을 찾고 있습니다. Android API으로 설정하면 외부 디렉토리가 아닌 디렉토리가 반환됩니다.Android에 마운트 된 SD 카드의 실제 크기를 얻는 방법은 무엇입니까?

"일반적으로이 파일은 SD 카드이지만 보호 된 내부 저장소와 다른 장치에 내장 된 저장소로 구현 될 수도 있습니다. 컴퓨터에 파일 시스템으로 마운트. "

그래서 "외부 저장소"디렉토리가 실제로 여러 개의 물리적 저장 장치 (내부 및 외부 메모리)로 분리 될 수 있다는 말을 모았습니다. 그리고 내 테스트에서이 방법을 사용하여 반환되는 크기가 실제 SD 카드 크기의 약 1.5 배인 것으로 밝혀졌습니다.

제 질문은 SD 카드에 전체 크기와 사용 가능한 공간을 반환하는 프로그래밍 방식이 있습니까? 전화 자체는 나에게 그 정보를 줄 수 있기 때문에 나는 길을 가져야한다고 느낀다. 그러나 나는 지금 당장 실망하고있다 ... 어떤 도움도 인정 될 것이다! 편집

: 이것은 내가 현재

private long TotalSDMemory(){ 
    File path = Environment.getExternalStorageDirectory(); 
    StatFs stat = new StatFs(path.getAbsolutePath()); 
    long blockSize = stat.getBlockSize(); 
    long totalBlocks = stat.getBlockCount(); 
    long totalSpace = totalBlocks * blockSize; 
    Log.d(TAG,"Size of total SD Memory: "+totalSpace); 
    Log.d(TAG, "External storage emulated: "+Environment.isExternalStorageEmulated()); 
    return totalSpace; 
} 

편집 (2) 전체 크기를 위해 사용하고 코드입니다 : 무엇을 어떤 내가이 중요 몰랐다 그러나 나는 삼성 갤럭시 S3가 I 코드를 테스트하는 데 사용하고 있는데, 분명히 삼성은 외부 메모리에 대해 다른 파일 구조를 가지고 있습니다. 다른 사람이 올바른 크기를 얻는 데 도움이되는 링크는 다음과 같습니다. Get size of SD card in Samsung phones

+0

편집 (2) :이 중요 몰랐다하지만 난이 삼성 전자 갤럭시 S3는 코드를 테스트하기 위해 사용하고있다. 분명히 삼성은 외부 메모리를위한 파일 구조가 다르다. 다른 사람들이 올바른 크기를 얻는 데 도움이되는 링크는 다음과 같습니다. [Samsung 휴대 전화에서 SD 카드를 가져옵니다.] (http://stackoverflow.com/questions/12087510/check-if-the-sdcard-is-present-boolean- is-always-true) –

답변

0

예, 방법이 있습니다.

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

있어 여기에서 것을 : Getting all the total and available space on Android


편집 :

Marcelo Filho는 POI를 가지고 How can I check how much free space an SD card mounted on an Android device has?

여기에 전체 크기 살펴보기에 대한 질문에 관한 이 방법은 API 18 (KitKat)에서 더 이상 사용되지 않습니다.

Google 대신 getAvailableBlocksLong()getBlockCountLong()을 사용하는 것이 좋습니다. 두 방법 모두 길이가이고 이 아니고이 반환됩니다.

힌트 :

Kikiwa이 데이터 유형 이들과 함께 사용되지 -now 사용되어야한다는 지적 - 파일 크기가 너무 큰 경우 그렇지 않으면 음수 값을 얻을 수 방법을.

+0

getAvailableBlocks() 또는 getBlocks() (비추천 API)를 사용하는 경우 가능한 한 빨리 값을 길게 캐스트하십시오 (3GB보다 큰 값의 경우 int는 음수가됩니다!). – Kikiwa

+1

Ty, double 형에서 long 형으로 데이터 유형을 편집합니다 – DuKes0mE

+1

해결책이 아닙니다. 그것은 쇼 외부 크기 sdcard를 탑재하지! – Peter

2
public String[] getSize() throws IOException { 
    String memory=""; 
    Process p = Runtime.getRuntime().exec("df /mnt/sdcard"); 
    InputStream is =p.getInputStream(); 
    int by=-1; 
    while((by=is.read())!=-1) { 
     memory+=new String(new byte[]{(byte)by}); 
    } 
    for (String df:memory.split("/n")) { 
     if(df.startsWith("/mnt/sdcard")) { 
      String[] par = df.split(" "); 
      List<String> pp=new ArrayList<String>(); 
      for(String pa:par) { 
       if(!pa.isEmpty()) { 
        pp.add(pa); 
       } 
      } 
      return pp.toArray(new String[pp.size()]); 

     } 
    } 
    return null; 
} 

getSize() [0]은/mnt/sdcard입니다. getSize() [1]은 sd의 크기입니다 (예제 12).0G)의 getSize() [2]를 사용, [3] 무료이며, [4]입니다 BLKSIZE

또는 :

new File("/sdcard/").getFreeSpace() - bytes of free in long 
new File("/sdcard/").getTotalSpace() - size of sd 
관련 문제