정상에서 IT를 외치다

[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (Nougat 대응) 본문

안드로이드

[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (Nougat 대응)

Black-Jin 2018. 10. 23. 12:14
반응형

안녕하세요. 블랙진입니다.!!


카메라와 갤러리에서 이미지 가져오기를 단계별로 포스팅을 진행하고 있습니다.


1. 카메라와 갤러리에서 이미지 가져오기

2. Nougat(Android OS 7) 대응하기

3. 카메라회전 각도를 고려한 이미지 가져오기

4. 가져온 이미지 크롭(Crop) 하기


이전 포스팅에 이어서 누가 버전에 대응할 수 있는 방법을 포스팅 하겠습니다.


Chapter 2. Nougat 대응하기


이슈


안드로이드 OS 누가 버전 이후부터는 file:// URI 의 노출을 금지하고 있습니다. 만약 URI 를 그냥 사용하게 되면 FileUriExposedException 발생하게 됩니다.


해결방안


FileProvider 을 통해 URI 를 감싸주면 됩니다.


<참고자료>

안드로이드 공식 페이지

http://programmar.tistory.com/4http://programmar.tistory.com/5




1. main/res 폴더 안에 provider_paths.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>



2.  AndroidManifest.xml 에 provide 를 추가해 줍니다.

<!-- 사진 촬영을 위한 provide -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="{package name}.provider"
android:exported="false"
android:grantUriPermissions="true">

<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>

AndroidManifest 에서 <application> .. </application> 사이에 추가해 주면 됩니다. 이 때 authorities 값은 '패키지명.provider' 로 설정해 주셔야합니다.



3. takePhoto 함수 수정

private void takePhoto() {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

try {
tempFile = createImageFile();
} catch (IOException e) {
Toast.makeText(this, "이미지 처리 오류! 다시 시도해주세요.", Toast.LENGTH_SHORT).show();
finish();
e.printStackTrace();
}
if (tempFile != null) {

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {

Uri photoUri = FileProvider.getUriForFile(this,
"{package name}.provider", tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, PICK_FROM_CAMERA);

} else {

Uri photoUri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, PICK_FROM_CAMERA);

}
}
}

카메라로 보내는 tempFile 의 uri 를 provider 로 감싸주는 로직이 추가되었습니다. 안드로이드 누가 하위 버전에서는 provider로 uri 를 감싸주면 동작하지 않는 경우가 있기 때문에 모든 기기에 적용하기 위해서는 버전 구분을 꼭 해주셔야 합니다.


Chapter2. 깃허브



관련 포스팅


1.  카메라와 갤러리에서 이미지 가져오기

2. Nougat(Android OS 7) 대응하기

3. 카메라회전 각도를 고려한 이미지 가져오기

4. 가져온 이미지 크롭(Crop) 하기

반응형
Comments