본문 바로가기

[Android]/허접 Programming Tips

Android 7.0 Nougat OS 이미지 사진 촬영 캡처 및 자르기(1/2)

1. 중요한 것이 Android 7.0이 되면서 기존 사용하던 이미지 캡처, 사진 촬영 후 자르는 기능이 작동되지 않는다. 그 이유로는 구글 공식 사이트에도 기재되어 있지만 아래와 같다.


앱 사이의 파일 공유


Android 7.0을 대상으로 하는 앱의 경우, Android 프레임워크는 앱 외부에서 file:// URI의 노출을 금지하는 StrictMode API 정책을 적용합니다. 파일 URI를 포함하는 인텐트가 앱을 떠나면 FileUriExposedException 예외와 함께 앱에 오류가 발생합니다.

애플리케이션 간에 파일을 공유하려면 content:// URI를 보내고 이 URI에 대해 임시 액세스 권한을 부여해야 합니다. 이 권한을 가장 쉽게 부여하는 방법은 FileProvider 클래스를 사용하는 방법입니다. 권한과 파일 공유에 대한 자세한 내용은 파일 공유를 참조하세요.


2. FileProvider을 사용하면 문제를 쉽게 해결할 수 있다(?) 그러나 현재 인터넷에 나와있는 7.0에서의 해당 기능 구현을 찾아볼 수 없어 제가 공유하려고 합니다. FileProvider 사용 법의 경우 StackOverFlow에서 쉽게 찾을 수 있습니다.

<Step 1>
res폴더 --> xml 디렉토리에 provider_paths.xml 파일을 아래와 같이 작성하여 만듭니다.

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="storage/emulated" path="."/>

</paths> 


<Step 2>
AndroidManifest.xml에 아래와 같이 입력합니다!

</application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="(자신의 패키지명).provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider>  ... </application>

android:authorities 부분에 (자신의 패키지명)이라고 되어있는 데, 저의 경우 "com.example.test"가 패키지명이니 
android:authorities="com.example.test.provider"이 되었습니다.


<Step 3>

기존에 코드들을 보면 Uri.fromFile함수를 사용합니다. 그러나 이를 사용하면 FileUriExposedException이 발생하기 때문에,

이 함수 대신 FileProvider.getUriForFile 함수를 사용하면 됩니다.


 photoUri = FileProvider.getUriForFile(SelectPhotoDialogActivity.this,"com.example.test.provider", photoFile); 



3. 그러나 이것만 보면 이해가 안되시겠죠? 그리고 저렇게 한다고 한들, 이미지 자르기 쪽으로 가거나 할 때 권한 flag 문제로 또한번

런타임 에러가 발생합니다!! 다음 포스트에서 사진 캡처, 이미지 선택 후 자르고 화면에 나타내는 방법에 대해 공유드리겠습니다.


참조한 사이트 : https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en