내 앱에서 다른 앱으로 파일을 안전하게 제공하려면, 콘텐츠 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
를 추가한 후에는 공유하려는 파일이 포함된 디렉터리를 지정해야 합니다. 디렉터리를 지정하려면 먼저 프로젝트의 하위 디렉터리에 filepaths.xml
파일을 res/xml/
만듭니다. 이 파일에서 각 디렉터리의 XML 요소를 추가하여 디렉터리를 지정합니다. 다음 스니펫은 res/xml/filepaths.xml
의 콘텐츠 예를 보여줍니다. 또한 이 스니펫에서는 내부 저장소 영역에 있는 files/
디렉터리의 하위 디렉터리를 공유하는 방법을 보여줍니다.
<paths> <files-path path="images/" name="myimages" /> </paths>
이 예에서는 <files-path>
태그를 통해 앱 내부 저장소의 files/
디렉터리 내에 있는 여러 디렉터리를 공유합니다. path
속성을 통해 files/
의 images/
하위 디렉터리를 공유합니다. name
속성은 경로 세그먼트 myimages
를 files/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
추가 관련 정보는 다음을 참조하세요.