공부하는 다락방

외장 SD카드 Path 가져오기 본문

Android

외장 SD카드 Path 가져오기

권파인 2017. 4. 12. 15:15

6.0(마시멜로우), 7.0(누가) 버전에서 SD카드 경로 가져오는 방식이 달라졌다.

storage/숫자/Android/data/....

이런식으로 구성 되어있는데 숫자에 들어갈 값은 sd카드 바인딩 할 때 생성되는 볼륨ID 어쩌고.. 이렇다더라..

그래서 경로를 가져오려고 할 때 정규표현식으로 가져와야하는 방식으로 바꿔야 한다고 한다.


/* returns external storage paths (directory of external memory card) as array of Strings */
public String[] getExternalStorageDirectories() {

        List<String> results = new ArrayList<>();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //Method 1 for KitKat & above
        File[] externalDirs = getExternalFilesDirs(null);

        for (File file : externalDirs) {
            String path = file.getPath().split("/Android")[0];

            boolean addPath = false;

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                addPath = Environment.isExternalStorageRemovable(file);
            }
            else{
                addPath = Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(file));
            }

            if(addPath){
                results.add(path);
            }
        }
    }

        if(results.isEmpty()) { //Method 2 for all versions
            // better variation of: http://stackoverflow.com/a/40123073/5002496
            String output = "";
            try {
                final Process process = new ProcessBuilder().command("mount | grep /dev/block/vold")
                .redirectErrorStream(true).start();
                process.waitFor();
                final InputStream is = process.getInputStream();
                final byte[] buffer = new byte[1024];
                while (is.read(buffer) != -1) {
                    output = output + new String(buffer);
                }
                is.close();
            } catch (final Exception e) {
                e.printStackTrace();
            }
            if(!output.trim().isEmpty()) {
                String devicePoints[] = output.split("\n");
                for(String voldPoint: devicePoints) {
                    results.add(voldPoint.split(" ")[2]);
                }
            }
        }

        //Below few lines is to remove paths which may not be external memory card, like OTG (feel free to comment them out)
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            for (int i = 0; i < results.size(); i++) {
                if (!results.get(i).toLowerCase().matches(".*[0-9a-f]{4}[-][0-9a-f]{4}")) {
                    Log.d(LOG_TAG, results.get(i) + " might not be extSDcard");
                    results.remove(i--);
                }
            }
        } else {
            for (int i = 0; i < results.size(); i++) {
                if (!results.get(i).toLowerCase().contains("ext") && !results.get(i).toLowerCase().contains("sdcard")) {
                    Log.d(LOG_TAG, results.get(i)+" might not be extSDcard");
                    results.remove(i--);
                }
            }
        }

        String[] storageDirectories = new String[results.size()];
        for(int i=0; i<results.size(); ++i) storageDirectories[i] = results.get(i);

        return storageDirectories;
    }


출처 : http://stackoverflow.com/questions/36766016/how-to-get-sd-card-path-in-android6-0-programmatically


'Android' 카테고리의 다른 글

.aab to .apk 변환  (0) 2020.03.09
알림채널(Notification Channel)  (0) 2018.09.07
안드로이드 디버깅 플랫폼  (0) 2017.04.07
URL XML 파싱 방법  (0) 2017.03.08
[안드로이드 스튜디오]로그캣(logcat) 색깔 바꾸기  (0) 2017.01.05
Comments