개발하는 두더지

[Android/안드로이드] sdcard 절대 경로 찾기 - JellyBean(젤리빈) 이상부터 내장 메모리의 변동, galaxy S3, S4 sdcard 문제 본문

Java,Android

[Android/안드로이드] sdcard 절대 경로 찾기 - JellyBean(젤리빈) 이상부터 내장 메모리의 변동, galaxy S3, S4 sdcard 문제

덜지 2016. 7. 22. 01:37

메니페스트에 추가

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

자파 파일에서 불러오는 양식

 

 

/*

 * sdcard 절대 경로 탐색

 * 외장 메모리가 있으면 외장메모리 절대경로

 * 만약 없다면 내장 메모리 위치를 전송

 */

String ext = Environment.getExternalStorageState();

if(ext.equals(Environment.MEDIA_MOUNTED)) {

sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();

} else {

sdPath = Environment.MEDIA_UNMOUNTED;

}

 

 

젤리빈 이전 버전에서는 내장 메모리의 절대 경로를 표시하면

/mtn/sdcard 로 출력되었다.

 

하지만 젤리빈부터는 심볼릭 링크(정확한 표현이 맞는지는 모르겠다.)를 통해서 다양한 경로로 내장 메모리에 접근이 가능하다.

메소드를 통해서 절대경로를 탐색하게되면 경로가 다음과 같이 나온다.

 

/storage/emulated/0 로 나오게 된다.

이 주소는 

/storage/sdcard0

/sdcard

/mnt/sdcard

 

와 같음을 알 수 있다.

 

그런데 의문점은 넥서스 7처럼 외장이 없는 자체 내장 메모리를 가지고 있는 경우에는

 

String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath(); 이 경로가 내부 메모리 경로인

/storage/emulated/0 를 잡게 된다.

 

HTC eve4G의 경우는 내장 메모리가 존재하지 않고 물리적인 외장 메모리만 마운트 되 있는 상태인데

이경우 sdcard 절대경로를 구하게되면 mnt/sdcard 로 인식하게 된다.

이는 내장이 없어서 바로 외장의 마운트를 인식하기 때문이다.

 

하지만 하나 문제점은 겔럭시 s3의 경우에는 내장 메모리와 외장 메모리가 모두 존재하게된다.

이때 절대 경로를 물어보게 되면 내장 메모리의 주소를 리턴하게된다.

아직까지 이 부분에 대해서는 어떻게 해결해야 할지 알지 못했다.

다만 여러 사이트를 참조한 결과 현재 이 기종에서만 발생되는 문제라고 하기도한다.

아래 링크는 이 문제에 대한 해결책들을 제시한 곳인데... 커널단에서 손을 댈수 없어서 일단은 다음 기회에..

 

http://stackoverflow.com/questions/5694933/find-an-external-sd-card-location

 

 

 

이것으로 내릴 수 있는 결론은 sdcard의 경로를 절대 hardcoding 하지 말자는 것이다.

기기마다 sdcard의 경로를 다르게 인식할수 있고 외장이나 내장 메모리의 경로도 다르기 때문이다.

기본적으로 /sdcard/ 를 경로로 해주면 대부분 인식하지만 만약의 경우를 위해서 경로를 탐색해서 사용하는것이 바람직 하다는 것이다.

Comments