본문 바로가기

major/Android

[Android] 갤러리 이미지 URI를 SQLite에 저장하고 불러오기

사이드 프로젝트로 간단한 앱을 기록 어플을 개발하는 도중에 갤러리에서 이미지를 가져와서 저장해야 할 일이 생겼습니다.

접근한 방법은

 

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