일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 목적중심리더십
- 어떻게 나답게 살 것인가
- 베드테이블
- 아비투스
- 한달어스
- 함수형 프로그래밍
- 면접
- 커스텀린트
- 목적 중심 리더십
- 브런치작가되기
- 테트리스
- 한달브런치북만들기
- 소프시스 밤부 좌식 엑슬 테이블
- 베드트레이
- 한단어의힘
- T자형인재
- 자취필수템
- 지지않는다는말
- 1일1커밋
- 끝말잇기
- 안드로이드
- 재택근무
- 소프시스
- 캐치마인드
- 한달독서
- 슬기로운 온라인 게임
- 좌식테이블
- 프래그먼트
- 북한살둘레길
- 리얼하다
- Today
- Total
정상에서 IT를 외치다
[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (Nougat 대응) 본문
안녕하세요. 블랙진입니다.!!
카메라와 갤러리에서 이미지 가져오기를 단계별로 포스팅을 진행하고 있습니다.
이전 포스팅에 이어서 누가 버전에 대응할 수 있는 방법을 포스팅 하겠습니다.
Chapter 2. Nougat 대응하기
이슈
안드로이드 OS 누가 버전 이후부터는 file:// URI 의 노출을 금지하고 있습니다. 만약 URI 를 그냥 사용하게 되면 FileUriExposedException 발생하게 됩니다.
해결방안
FileProvider 을 통해 URI 를 감싸주면 됩니다.
<참고자료>
http://programmar.tistory.com/4, http://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 를 감싸주면 동작하지 않는 경우가 있기 때문에 모든 기기에 적용하기 위해서는 버전 구분을 꼭 해주셔야 합니다.
관련 포스팅
2. Nougat(Android OS 7) 대응하기
'안드로이드' 카테고리의 다른 글
[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (크롭 기능 추가) (10) | 2018.10.23 |
---|---|
[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (카메라 회전각도 적용) (6) | 2018.10.23 |
[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (26) | 2018.10.23 |
[Android, Butterknife] 버터나이프 추상화 (0) | 2018.10.12 |
[Android, fragmentManager] 상태 유지된 fragment 보여주기 (8) | 2018.10.12 |