마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드(4.0이상) 에서 SD카드 마운트 확인이 가능한가요??

0 추천
브로드캐스트 이벤트로 장치가 마운트/언마운트 하는게 "감지"는 되더군요.

그런데 제가 알고 싶은건 감지라기 보다는 "현재 장치에 SD카드가 마운트 되어 있는지 아닌지" 알아내는것 입니다...

물론 외부저장소의 상태를 가져오는 안드로이드 API는 존재합니다.

하지만 근래의 기기들은 출시떄부터 기본적으로 (SD카드가 아닌) 외부 저장소를 삽입한채로 발매가 되더군요...

그래서 API를 사용하면 외부저장소가 두개 잡혀버립니다... 그리고 두 장치중 어떤게 .SD카드인지 알아낼수 있는 방법이 없더군요... (물론 뒷번호의 외부저장소가 SD카드라는것을 "유추"까지는 할 수 있지만...)

API를 사용하지 않고, 리눅스 시스템파일을 파싱해서 정보를 얻어내는 방법도 있었지만, 이 방법은 킷캣에서는 적용이 불가하다고 하는 문제점이 있더군요... 사실 이 방법은 기기마다 특성을 탈수도 있는 방법이기도 하고.. (제 타겟 환경은 아이스크림~킷캣)

무슨 뾰족한 방법이 없을까요? 정말로 안드로이드에서 이를 확인하는 방법은 없는걸까요? 차라리 없다면 없다는걸 확실하게라도 해두고 싶어요.

ps; 비루팅장치에서 외부저장소를 마운트/언마운트는 역시 불가능한걸까요...
v닉네임v (120 포인트) 님이 2014년 8월 12일 질문

1개의 답변

0 추천
1. 외부 저장소 경로

Context.getExternalFilesDirs() 를 이용하시면 됩니다.

반환되는 배열값에서 0번째가 내장 스토리지, 1번째가 SD카드의 경로입니다.

둘다 자신의 어플의 데이터 경로를 가지고 오니 적당이 잘라서 사용하심 됩니다.

다만 안드로이드4.4부터 추가된 API이기 때문에 그 이하라면 ContextCompat.getExternalFilesDirs() 를 이용해주세요.

 

안드로이드 4.4이상

http://developer.android.com/reference/android/content/Context.html#getExternalFilesDirs(java.lang.String)

 

안드로이드 4.4 미만

http://developer.android.com/reference/android/support/v4/content/ContextCompat.html#getExternalFilesDirs(android.content.Context, java.lang.String)

 

2. SD카드 마운드, 언마운트 관련

정식 API로는 없지만 com.android.server.MountService 를 리플렉션해서 사용하시면 마운트, 언마운트가 가능합니다.

다만, 안드로이드 4.2부터 android.permission.MOUNT_UNMOUNT_FILESYSTEMS 의 프로텍션 레벨이 system|signature 로 바뀌었기 때문에 4.2이상은 서드파티 어플은 마운트, 언마운트가 불가능합니다.
레미_21 (2,920 포인트) 님이 2014년 8월 12일 답변
현재 테스트 기기가 젤리빈이라 ContextCompat.getExternalFilesDirs()를 사용했는데,
기기에 내장되어 있는 외장스토리지 밖에 보이지 않아요.

File[] StorageList = ContextCompat.getExternalFilesDirs(getApplicationContext(), null);
Log.e("Storage Max Count : ", String.valueOf(StorageList.length));

분명 SD카드가 마운트되어 있는데 보이는 장치는 하나뿐이네요. 분명 두개(기기에 내장된 외장스토리지 + SD카드)가 잡혀야 할텐데.
4.4 아래 버전에서는 플랫폼 API에서 external 경로를 1개만 리턴하게 되어있습니다. ContextCompat을 쓴다고 플랫폼이 지원하지 않는 것을 제공해주는게 아닙니다.
4.4미만의 버전에서는 external storage가 2개이상인 장치는 제대로 검출할수가 없는것이였군요. 이렇게 되면 환경변수(System.getenv())를 찾아서 수동으로 검사하는 방법 밖에 없을것 같네요... 그런데 이 방법으로 접근해서 모든 장치에서 정확한 값을 얻을수 있을지가...
...