파일 공유 설정

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

참고: FileProvider 클래스는 AndroidX 핵심 라이브러리의 일부입니다. 이 라이브러리를 애플리케이션에 포함하는 방법에 관한 자세한 내용은 종속 항목 선언을 참고하세요.

FileProvider 지정

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

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
        ...>
        <provider
            android:name="androidx.core.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 확장자는 없습니다.이 파일의 콘텐츠는 다음 섹션에서 설명합니다.

공유 가능 디렉터리 지정

앱 매니페스트에 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 속성은 경로 세그먼트 myimagesfiles/images/ 하위 디렉터리에 있는 파일의 콘텐츠 URI에 추가하도록 FileProvider에 지시합니다.

<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

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