사이드 프로젝트로 간단한 앱을 기록 어플을 개발하는 도중에 갤러리에서 이미지를 가져와서 저장해야 할 일이 생겼습니다.
접근한 방법은
1. 갤러리에서 이미지 URI를 가져온 뒤
2. 절대 경로로 변경하고
3. DB에 절대경로를 저장하고
4. 절대경로 URI를 통해서 ImageView에 setImage를 한다 였습니다.
처음 개발할 때는 이 방법이 먹혔는데, 일부 버전에서 에러가 있었고, 소스코드를 고치는 와중에 minSdk 버전을 올렸는데 그때부터 아예 URI를 통해서 이미지를 가져오는 게 불가능했습니다.
첫 번째로 발생한 에러는 java.io.FileNotFoundException: No content provider입니다.
java.io.FileNotFoundException: No content provider /storage/emulated/0/Download/7f3151a6f3e6907885fddc31f30a30f.jpg
검색해보니 url 앞에 "file://"을 붙이면 된다고 해서 실행해봤습니다.
그리고 발생한 건 open failed: ENOENT (No such file or directory) 에러였습니다.
WRITE, READ external storage 권한은 옛 저녁에 줬는데 에러 해결방법이 외부저장소 권한만 해결하면 된다고 나와있었습니다.
파일, 디렉토리 생성부터 마운트까지 구글에 검색해서 하라는대로 다 해봤는데 안됐습니다.
화가나서 SQLite에 bitmap으로 이미지를 저장하려다가, 참고 다시 처음부터 찾아보니 갤러리를 불러올 때 Type 설정을 잘못했더라구요.
성공한 코드는 아래와 같습니다.
static final int REQUEST_CODE = 1;
ImageView imageView;
Uri uri;
public void onClickButton1(View view){
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
if (requestCode == REQUEST_CODE) {
uri = data.getData();
}
}
Button을 클릭하면 갤러리를 호출합니다. 그리고 이미지를 선택했다면 그 이미지의 uri을 가져옵니다.
SQLite에는 그냥 string형으로 저장하면 됩니다.
private void setImage(Uri uri) {
try{
InputStream in = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(in);
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e){
e.printStackTrace();
}
}
Bitmap으로 image를 가져와서 setImageBitmap()으로 imageView에 이미지를 보여줍니다.
정말 간단하게 해결할 수 있는 문제인데 한참 걸렸습니다.
잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.
이 포스팅이 도움이 되었다면 공감 부탁드립니다.
궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D
'major > Android' 카테고리의 다른 글
[Android] 모서리 둥글게하고 그라데이션 효과 주기 (7) | 2020.04.11 |
---|---|
구글 플레이 앱 업데이트, 버그 수정, 삽질기 (0) | 2020.03.30 |
[Kotlin] SQLite 사용법 정리 (1) | 2020.03.27 |
[Kotlin] 네이버 오픈 API 검색 사용하기 (0) | 2020.03.27 |
[Kotlin] 공공 데이터 - 공적 마스크 데이터 구글맵에 띄우기 (0) | 2020.03.26 |