마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

외부 메모리 이미지 관련 궁금증

0 추천
안녕하세요, 초보개발자입니당~
 
개념이 안잡혀서 계속 멩붕멩붕하고 있네요 ㅠ ㅠ ㅋㅋㅋㅋ
 
외부메모리에 있는 이미지를 이용하고자할 때, 아래와 같이 커서를 사용하면 잘 되는데요
 
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
 
 
아래와 같이 썸네일 이미지를 이용하려고 하면 커서의 getCount 값이 0 이네요.. 왜 그런걸까요?
여기저기 어댑터에 붙여 그리드뷰에 표현하는 예제들을 보면 잘 사용하던데 @_@
 
Cursor cursor = getContentResolver().query(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, null, null, null, null);
 
uri 와 실제 경로의 차이는 뭘까요..
이미지 uri 는 "content://media/external/images/media/"
썸네일 uri 는 "content://media/external/images/thumbnails/"
실제 경로는 일반적으로 /mnt/sdcard/ 인데 어떻게 매칭되는건지..
 
또 궁금한게 저번에 질문 올렸을 때, 미디어스캔 얘기하신분들이 계셨는데
제가 알기로는 안드로이드에서 자체적으로 파일열기,복사,이동,수정 등의 작업 발생 시 수행하는데 아닌가요?
썸네일 등의 이미지를 작업하기 전에 코드상에서 구현을 해야하는거에요?
갤러리에 들어가보면 미리보기 이미지(썸네일)가 보이니까
안드로이드에서 이미 자체적으로 미디어스캔했다고 볼수 있지않나요?
 
모든 이미지를 가리키는데 ID 값이 어떤 기준으로 잡히는건지도 알고 싶어요..
제가 봤을 때는 sd 카드에 저장하는 역순으로 잡히는 것 같은데 확실하지가 않아서 ;ㅅ;
질문이 많지만.. 아는 부분있으시면 알려주세요~
 
멩붕멩붕 ~_~.. 고수님들 부디 가르침을!

 

초보개발자ㅠ (33,870 포인트) 님이 2014년 3월 4일 질문
초보개발자ㅠ님이 2014년 3월 4일 수정

1개의 답변

0 추천
 
채택된 답변

외부 저장장치에 저장된 이미지의 썸네일을 그리드뷰로 보여주는 예제를 만들었습니다. CreDevMaster  님의 블로그에 기재된 코드를 조금 수정했습니다. 참고하세요.

http://blog.naver.com/goodsogi/40207753368

 

미디어스캔은 자동으로 작업을 수행하는데요. 가끔 인위적으로 스캔을 시켜야 하는 경우가 있는 것으로 알고 있습니다. 아마 미디어 스캔이 작동하는 시간보다 먼저 이미지를 인식시켜야 하는 경우가 아닐까 싶네요. 

 

방귀과장 (18,940 포인트) 님이 2014년 3월 4일 답변
초보개발자ㅠ님이 2014년 3월 6일 채택됨
방귀과장님 답변 감사합니다~ ^^
올려주신 코드를 수행해보았는데 아무것도 뜨지 않네요 ㅠㅠ
SD 카드에 이미지는 150장 정도 들어있어요
이미지를 넣으면 썸네일 이미지가 자동으로 생기는거 아닌가요..
경로가 잘못된건지 썸네일을 생성해야하는건지
여기저기 찾아보고 물어봐도 속시원한 대답을 못듣네요....
다들 그냥 저렇게 쓰면 읽어오는거 같은데 왜 저는 안되는거? ㅜㅜ
제 폰에서는 잘 뜨던데 혹시 외부 메모리 경로 문제가 아닌가 싶네요. 폰마다 외부 메모리 경로가 다를 수 있거든요.

어떤 폰 사용하세요? 안드로이드 버전은 어떻게 되나요? 에뮬레이터에 한 번 실행해보셨어요?
폰은 아니고 ^^; 환경은 ICS 4.0.3 테스트보드구요.
가상 SD Card 만들어 넣고 /mnt/sdcard/ 에 폴더하나 만들어서
png 이미지 150개 정도 넣어주었어요~

썸네일이 아닌 일반 이미지는 위 본문에도 작성했듯이 잘 되요 ㅠ 썸네일만.......
Cursor cursor = getContentResolver().query(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, null, null, null, null);

위 쿼리에서 MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI 다음에 projection를 안넣으신 것 것 같네요.



String[] img = { MediaStore.Images.Thumbnails._ID };
        imagecursor = managedQuery(
                MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, img, null,
                null, MediaStore.Images.Thumbnails.IMAGE_ID + "");

혹시 안되면 여기를 참고해보세요.

http://stackoverflow.com/a/18304390/1952115
일단 방귀과장님이 말씀하신대로 방금 프로젝션도 넣어서 테스트 해봤는데 여전히 아무것도 안뜨네요 ㅠㅠ 제가 알기로는 프로젝션이 해당 필드의 열(column) 값을 가져오는 거라서 무관하고 프로젝션이 없을 경우 모든 필드를 가져오는 걸로 알고있어용~ Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 요 녀석은 정상 작동하니까요 '-'ㅋ
반대로 생각해보면 getCount() 값이 0 이니 썸네일 이미지가 안뜨는건 당연한 결과인데 왜 인식이 안되는지를 모르겠네요 ㅠ ㅠ 아옹 답답하네요... 이걸가지고 며칠을.......
혹시 가상 sd card 인게 상관있을까요??
...