Uri.fromFile() 사용 시, FileUriExposedException 발생하는 경우.1 min read
기존 잘 사용해오던 기본 카메라앱을 통해 사진을 찍고 불러오는 과정에서 FileUriExposedException 오류가 발생하기 시작했다.
Intent(MediaStore.ACTION_IMAGE_CAPTURE)를 통해 기본 카메라앱을 실행시키고, MediaStore.EXTRA_OUTPUT를 추가하여 출력될 파일의 Uri를 지정해 주는 과정에서 발생한 오류이다.
원인은 File을 Uri로 변경하는 부분인 Uri.fromFile()이다.
안드로이드 7.0 부터 개인 파일의 보안을 강화하기 위해 개인 디렉토리의 액세스를 제한하고 이러한 제한사항으로 SecurityException과 FileUriExposedException이 발생할 수 있으며 해결책으로 FileProvider 사용을 권장하고 있다.
즉, Uri클래스의 fromFile()를 통해 얻어온 Uri(“file://…”)가 카메라앱으로 공유함으로써 발생한 오류이다.
Android 7.0 동작 변경 사항(앱 사이의 파일 공유)
앱 사이의 파일 공유Android 7.0을 대상으로 하는 앱의 경우, Android 프레임워크는 앱 외부에서 file:// URI의 노출을 금지하는 StrictMode API 정책을 적용합니다. 파일 URI를 포함하는 인텐트가 앱을 떠나면 FileUriExposedException 예외와 함께 앱에 오류가 발생합니다. 애플리케이션 간에 파일을 공유하려면 content:// URI를 보내고 이 URI에 대해 임시 액세스 권한을 부여해야 합니다. 이 권한을 가장 쉽게 부여하는 방법은 FileProvider 클래스를 사용하는 방법입니다. 권한과 파일 공유에 대한 자세한 내용은 파일 공유를 참조하세요. |
간단한 해결책으로는
build.gradle의 targetSdkVersion을 24미만으로 설정하는 방법이다.
하지만 한번 올려서 배포한 앱은 내릴수 없고, 장기적으로 서비스를 유지하기 위해서는 FileProvider를 이용하는 것이다.
자세한 내용은 FileProvider 또는 Sharing Files를 참고 할수 있다.
FileProvider 방법.
- res> xml> file paths.xml 파일 생성
|
xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external_files" path="." /> </paths> |
- AndroidManifest.xml에 Provider 추가.
<provider android:name="android.support.v4.content.FileProvider" android:authorities=“{package_name}.fileprovider" android:exported="false" android:grantUriPermissions="true">
android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> |
- Uri.fromFile() 대신 FileProvider.getUriForFile
|
FileProvider.getUriForFile(this,”{package_name}.fileprovider",mDestinationFile); |
* 참고
FileProvider가 android.support.v4에 포함되어있기 때문에 하위버전에서 동작을 한다.
다만 안드로이드7.0부터 FileProvider를 이용하고 테스트 결과 롤리팝 미만의 4.x 버전에서는 카메라앱에 따라 FileProvider로 생성한 Uri를 인식하지 못하는 앱이 발생 할 수 있으니 FileProvider사용은 안드로이드7.0(누가) 부터 사용될수 있도록 분기처리 해주어야 할 듯 하다.
'개발 > 안드로이드' 카테고리의 다른 글
setAudioStreamType and setAudioAttributes (0) | 2019.06.12 |
---|---|
[Android] FileProvider :: android.os.FileUriExposedException (0) | 2019.06.11 |
RxJava와 Room DB (0) | 2019.05.31 |
Android Action Mode (0) | 2019.05.31 |
Android View Stub (0) | 2019.05.31 |
댓글