Android 애플리케이션을 개발할 때, 사용자가 기기에서 파일을 선택하도록 요청하는 경우가 많습니다. 이때 주로 ACTION_GET_CONTENT와 ACTION_OPEN_DOCUMENT라는 두 가지 인텐트 액션을 사용하게 됩니다. 이 두 액션은 표면적으로는 비슷해 보이지만, 내부 동작 방식과 권한 처리에서 중요한 차이점을 가집니다. 이 글에서는 두 액션의 실제적인 차이점과 올바른 사용 시나리오에 대해 깊이 있게 다루겠습니다.
1. ACTION_GET_CONTENT와 ACTION_OPEN_DOCUMENT의 결정적 차이점
두 액션의 가장 큰 차이는 바로 **'소유권(Ownership)'**과 **'권한(Permission)'**에 있습니다. 이를 명확하게 이해하는 것이 중요합니다.
ACTION_GET_CONTENT: 이 액션은 **'파일의 사본'**을 가져오는 데 사용됩니다. 사용자가 파일을 선택하면, 앱은 해당 파일의 콘텐츠(content)를 복사하여 임시적으로 사용합니다. 따라서 파일에 대한 지속적인 접근 권한이 필요하지 않으며, **일회성 데이터 가져오기**에 적합합니다. 예를 들어, 프로필 사진을 업로드하거나 첨부 파일을 한 번 읽어올 때 사용됩니다.ACTION_OPEN_DOCUMENT: 이 액션은 **'파일 자체에 대한 지속적인 접근 권한'**을 요청합니다. 사용자가 파일을 선택하면, 앱은 해당 파일의 URI(Uniform Resource Identifier)를 통해 파일에 대한 읽기/쓰기 권한을 부여받습니다. 이 권한은 앱이 종료되더라도 유지될 수 있어, **문서를 반복적으로 수정하거나 장기간 접근해야 할 때** 이상적입니다. 예를 들어, 사진 편집기나 문서 편집기 앱에서 파일을 열어 수정하고 저장할 때 사용됩니다.
2. 올바른 사용 시나리오 선택
2.1. ACTION_GET_CONTENT 사용 시
주요 목적: 일회성 데이터 읽기 및 가져오기
- 프로필 사진, 배경 이미지 등 **한 번 선택해서 사용하는** 이미지 업로드 기능.
- 사용자가 선택한 파일을 앱의 내부 저장소에 **복사하여** 보관해야 할 때.
- 첨부 파일을 읽어와서 이메일 전송과 같이 **한 번만 처리**하고 끝내는 작업.
2.2. ACTION_OPEN_DOCUMENT 사용 시
주요 목적: 지속적인 파일 접근 및 수정
- PDF 리더, 문서 편집기 등 **파일을 열어서 반복적으로 수정하고 저장**해야 할 때.
- 사용자가 선택한 파일에 대해 **읽기, 쓰기 권한을 장기간 유지**해야 할 때.
- Android 4.4(API 19) 이후에 도입된 **새로운 '문서 저장소 프레임워크(Storage Access Framework)'**를 활용하고자 할 때. 이 프레임워크는 사용자의 파일을 안전하게 관리하고 접근하는 표준 방식을 제공합니다.
3. 구현 예제 (Kotlin)
두 액션의 구현 코드는 비슷해 보이지만, 그 결과로 얻는 URI의 성격이 완전히 다릅니다. 아래 코드를 참고하여 인텐트를 구성할 수 있습니다.
3.1. ACTION_GET_CONTENT 구현
val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*" // 모든 종류의 파일 선택 가능
}
startActivityForResult(intent, REQUEST_CODE_GET_CONTENT)
3.2. ACTION_OPEN_DOCUMENT 구현
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*" // 모든 종류의 파일 선택 가능
}
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT)
💡 중요: startActivityForResult는 Android 10(API 29)부터 deprecated 되었으며, 최신 개발에서는 registerForActivityResult를 사용하는 것이 권장됩니다.
4. 개발 시 고려사항
- Android 버전 호환성:
ACTION_OPEN_DOCUMENT는 Android 4.4(API 19) 이상에서만 사용 가능합니다. 그 이전 버전을 지원해야 한다면ACTION_GET_CONTENT를 사용하거나, 버전별로 분기 처리를 해야 합니다. - 권한 관리:
ACTION_OPEN_DOCUMENT로 얻은 URI의 지속적인 권한을 유지하려면takePersistableUriPermission메서드를 호출하여 권한을 영구적으로 부여받는 추가적인 처리가 필요할 수 있습니다. - 사용자 경험(UX): 두 액션은 다른 UI를 제공합니다.
ACTION_OPEN_DOCUMENT는 '문서' 개념에 특화된 표준화된 파일 탐색기를 제공하여 사용자에게 익숙한 경험을 제공합니다. 앱의 목적에 맞는 UI를 선택하는 것이 중요합니다.
결론
ACTION_GET_CONTENT와 ACTION_OPEN_DOCUMENT의 핵심은 **파일에 대한 접근 방식**과 **권한의 지속성**에 있습니다. ACTION_GET_CONTENT는 파일의 일회성 복사본을 가져오는 용도로, ACTION_OPEN_DOCUMENT는 원본 파일에 대한 지속적인 접근이 필요할 때 사용해야 합니다. 앱의 요구사항과 대상 Android 버전을 명확히 파악하고, 올바른 인텐트 액션을 선택함으로써 더 안전하고 효율적인 사용자 경험을 제공할 수 있습니다.