파일 공유 설정

앱에서 다른 앱으로 파일을 안전하게 제공하려면 콘텐츠 URI 형식으로 파일에 안전한 핸들을 제공하도록 앱을 구성해야 합니다. Android FileProvider 구성요소에서는 개발자가 XML에서 제공하는 사양에 따라 파일의 콘텐츠 URI를 생성합니다. 이 강의에서는 FileProvider의 기본 구현을 앱에 추가하는 방법과 다른 앱에 제공할 파일을 지정하는 방법을 안내합니다.

참고: FileProvider 클래스는 v4 지원 라이브러리의 일부입니다. 이 라이브러리를 애플리케이션에 포함하는 방법에 관한 자세한 내용은 지원 라이브러리 설정을 참조하세요.

FileProvider 지정

앱에 FileProvider를 정의하려면 manifest에 항목이 있어야 합니다. 이 항목을 통해 콘텐츠 URI 생성에 사용할 권한을 지정합니다. 또한 앱이 공유할 수 있는 디렉터리를 지정하는 XML 파일의 이름도 지정합니다.

다음 스니펫에서는 FileProvider 클래스, 권한, XML 파일 이름을 지정하는 <provider> 요소를 manifest에 추가하는 방법을 보여줍니다.

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
            ...>
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="com.example.myapp.fileprovider"
                android:grantUriPermissions="true"
                android:exported="false">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/filepaths" />
            </provider>
            ...
        </application>
    </manifest>

이 예에서 android:authorities 속성은 FileProvider에서 생성한 콘텐츠 URI에 사용할 URI 권한을 지정합니다. 이 예에서 권한은 com.example.myapp.fileprovider입니다. 자체 앱에서 'fileprovider' 문자열이 추가된 앱의 android:package 값으로 구성된 권한을 지정하세요. 권한 값에 관해 자세히 알아보려면 콘텐츠 URI 주제와 android:authorities 속성 관련 문서를 참조하세요.

<provider><meta-data> 하위 요소는 공유하려는 디렉터리를 지정하는 XML 파일을 가리킵니다. android:resource 속성은 이 파일의 경로 및 이름으로서 .xml 확장자는 없습니다.이 파일의 콘텐츠는 다음 섹션에 설명되어 있습니다.

공유 가능 디렉터리 지정

앱 manifest에 FileProvider를 추가했으면 공유하려는 파일이 포함된 디렉터리를 지정해야 합니다. 디렉토리를 지정하려면 먼저 프로젝트의 하위 디렉터리 res/xml/filepaths.xml이라는 파일을 만드세요. 이 파일에서 각 디렉터리의 XML 요소를 추가하여 디렉터리를 지정하세요. 다음 스니펫에서는 res/xml/filepaths.xml의 예시 콘텐츠를 보여줍니다. 또한 이 스니펫에서는 내부 저장소 영역에 있는 files/ 디렉터리의 하위 디렉터리를 공유하는 방법을 보여줍니다.

    <paths>
        <files-path path="images/" name="myimages" />
    </paths>

이 예시에서는 <files-path> 태그를 통해 앱 내부 저장소의 files/ 디렉터리 안에 있는 여러 디렉터리를 공유합니다. path 속성을 통해 files/의 하위 디렉터리인 images/를 공유합니다. name 속성은 FileProvider에게 경로 세그먼트 myimages를 하위 디렉터리 files/images/에 있는 파일의 콘텐츠 URI에 추가하도록 지시합니다.

<paths> 요소에는 하위 요소가 여러 개 있을 수 있으며, 각 하위 요소에서는 공유할 다른 디렉터리를 지정합니다. <files-path> 요소 외에도 <external-path> 요소를 사용하여 외부 저장소에 있는 디렉터리를 공유하고 <cache-path> 요소를 사용하여 내부 캐시 디렉터리에 있는 디렉터리를 공유할 수 있습니다. 공유 디렉터리를 지정하는 하위 요소에 관해 자세히 알아보려면 FileProvider 참조 문서를 참조하세요.

참고: XML 파일은 공유하려는 디렉터리를 지정할 수 있는 유일한 방법입니다. 프로그래밍 방식으로 디렉터리를 추가할 수는 없습니다.

이제 앱 내부 저장소의 files/ 디렉터리에 있는 파일 또는 files/의 하위 디렉터리에 있는 파일의 콘텐츠 URI를 생성하는 FileProvider의 사양을 완전히 지정하였습니다. 앱에서 파일의 콘텐츠 URI를 생성할 때 이 URI에는 <provider> 요소(com.example.myapp.fileprovider), 경로 myimages/, 파일 이름에 지정된 권한이 포함됩니다.

예를 들어 이 강의의 스니펫에 따라 FileProvider를 정의하고 default_image.jpg 파일의 콘텐츠 URI를 요청하면 FileProvider에서는 다음과 같은 URI를 반환합니다.

    content://com.example.myapp.fileprovider/myimages/default_image.jpg

추가 관련 정보는 다음을 참조하세요.