안드로이드 <Kotlin>

[android] intent ACTION_OPEN_DOCUMENT 사용 시 EXTRA_INITIAL_URI 활용하여 특정 디렉토리 열기

TaeGyeong Lee 2023. 12. 8. 16:47

개요

안드로이드 버전마다 저장소 위치가 상이할 수 있습니다. 저는 안드로이드 13, S21 (SM-G991N)에서 구동하였습니다. 참고해 주세요.

EXTRA_INITIAL_URI 을 활용하여 파일 관리자가 특정 디렉토리를 열도록 만들어 보겠습니다.

 

주의 사항

intent에 인코딩된 Uri을 전달해 주어야 합니다. 

Uri에서 path 단은 반드시 인코딩(예: / -> %2F)된 문자열로 구성되어 있어야 합니다.

// BAD
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:Pictures/");

// GOOD
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3APictures%2F");

 

AOSP Uri parse 메소드에 인코딩된 uriString을 받아야 함을 주석에서 명시하고 있습니다.

/**
     * Creates a Uri which parses the given encoded URI string.
     *
     * @param uriString an RFC 2396-compliant, encoded URI
     * @throws NullPointerException if uriString is null
     * @return Uri for this given uri string
     */
    public static Uri parse(String uriString) {
        return new StringUri(uriString);
    }

 

Pictures 열기

Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3APictures%2F");
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
                intent.setType("image/*");
                startActivity(intent);

 

Download/dog 열기

다운로드 디렉토리 내 dog 디렉토리를 열도록 설정할 수 있습니다.

Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3ADownload%2Fdog%2F");
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
                intent.setType("image/*");
                startActivity(intent);

 

기타 디렉토리 열기

문서 디렉토리

Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3ADocuments%2F");

 

참고 자료

 

공유 저장소의 문서 및 기타 파일 액세스  |  Android 개발자  |  Android Developers

DataStore는 로컬 데이터를 저장하는 최신 방법을 제공합니다. SharedPreferences 대신 DataStore를 사용해야 합니다. 자세한 내용은 DataStore 가이드를 참고하세요. 공유 저장소의 문서 및 기타 파일 액세스

developer.android.com

 

Can't open specified folder android R

Hi everyone i know in android R i cant open folder in /storage/emulated/0/Android/data/ section so i created a folder in /storage/emulated/0/Document/myapp to save images from my app (screenshot) h...

stackoverflow.com

 

core/java/android/net/Uri.java - platform/frameworks/base - Git at Google

 

android.googlesource.com

 

Android 11 scoped Storage problem — One possible solution

Android 11 introduced some several “improvements” to the external storage. If you didn’t know about this, you should read this article:

medium.com