본문 바로가기

소프트웨어/Android/Java/Ndk

안드로이드] 저장소 경로 얻을시 emulater/0 해결법

!!!추가

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



갤럭시 s4를 이용해서 안드로이드 프로젝트를 진행하고있다.

그런데 storagestate를 검사하여 저장소를 찾고있는데 toast를 띄워보니깐 경로가


sdcard/emulater/0 으로 뜨는것이 아닌가.


구글링을 통해 해결법을 확인하였다.



우선 루트 dir이 저렇게 뜨는 이유는 jellybean이상의 버전부터는 저장소로 접근하는 명령어가 여러 종류가 되면서 저런 방식으로 바뀌었다고 한다.(?)

그래서 다음과 같은 해결법을 얻게 되었다.


//클래스 전역변수

private final String rootFolderName = "/MemoWithREC";

private final String memoListFolderName = "/MemoList/";

public static String root = null; //메모를 저장하는 폴더의 root dir

public static String memoRoot = null; //메모를 저장하는 폴더 dir


//dir init

        String sdcard= Environment.getExternalStorageState();

        if( ! sdcard.equals(Environment.MEDIA_MOUNTED) ) {

        //SD카드 UNMOUNTED

        Log.d("mstag","sdcard unmounted");

        root = "" + Environment.getRootDirectory().getAbsolutePath() + rootFolderName; //내부저장소의 주소를 얻어옴

        } else {

        //SD카드 MOUNT

        Log.d("mstag","sdcard mounted");

        root = "" + Environment.getExternalStorageDirectory().getAbsolutePath() + rootFolderName; //외부저장소의 주소를 얻어옴

        }

        Log.d("mstag","root dir is => "+root);

        memoRoot = root + memoListFolderName;

        File rootCheck = new File(root);

        if( ! rootCheck.exists() ) { //최상위 루트폴더 미 존재시

        rootCheck.mkdir(); Log.d("mstag","root make");

        rootCheck = new File(memoRoot); 

        if( ! rootCheck.exists() ) { //하위 메모저장폴더 미 존재시 

        rootCheck.mkdir(); Log.d("mstag","root-son make");

        }

        }


Environment에서 제공하는 media_mounted상수와 현재 외부저장소의 상태를 equals로 비교해서 sd카드 유무를 나눠서 dir을 얻는다.