본문 바로가기

프로그래밍/Android

MediaStore 썸네일 데이터 관련 정리

 

>> 오디오

오디오의 경우 MediaStore.Audio.Media 에 컨텐츠 정보, MediaStore.Audio.Albums에 썸네일 정보가 저장되어 있다. 앨범별 썸네일을 관리하는 이유는 컨텐츠별 썸네일과의 중복 문제 때문이다.

 

따라서, MediaStore.Audio.Media 로 컨텐츠 검색 후, MediaStore.Audio.AudioColumns.ALBUM_ID 로 다시 앨범 테이블을 검색해야 원하는 썸네일을 얻을 수 있다.

 

데이터 취득 절차

이미지 uri를 얻어 바로 불러 오는 형태를 사용하나, 일단 기본 적인 순서는 아래와 같다.

 

MediaStore.AudioMeida.EXTERNAL_CONTENT_URI에서 MediaStore.Audio.Media를 쿼리해 미디어 정보를 얻음.

 

커서얻기

context.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,

null,

null,

null,

null);

 

액티비티 인 경우 managedQuery() 메쏘드를 사용해도 된다.

managedQuery( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null );

 

커서를 돌며 필요한 정보를 얻고,

id = cursor.getInt( cursor.getColumnIndex( MediaStore.Audio.Media._ID));

album_id = cursor.getInt( cursor.getColumnIndex( MediaStore.Audio.Media.ALBUM_ID));

.

.

 

Media.Audio.Albums 테이블에서 Media.Audio.Albums.ALBUM_ART select한다.

where 절은 Media.Audio.Albums._ID 와 미디어의 album_id가 일치되는 녀석들.

 

 

데이터 값

실제 이미지파일의 path 정보이다. 오디오의 경우 확장자 .jpg가 빠진채로 저장된다.

미디어 스캔시 이미지로 분류되지 않게 하기 위함인듯...

 

필드명 : MeidaStore.Audio.Albums.ALBUM_ART

/mnt/sdcard/Android/data/com.android.providers.media/albumthumbs/식별번호

 

 

URI 만들기

위와 같이 PATH를 취득 하고, 해당 PATH로 데이터를 읽어오는 방법 외에 uri를 통해 바로 이미지를 불러올 수 있다.

 

직접 불러올 수 있는 메쏘드들을 제공해 주는데, 이를 사용하면 쿼리의 수도 줄고 편리하다. 앨범 id만 알고 있으면 바로 uri를 통해 이미지를 생성할 수 있다.

 

앨범아트는 uri 제공하지 않으므로, 별도로 생성한다.

앨범아트 uri = Uri.parse("content://media/external/audio/albumart");

 

앨범아트 uri 앨범id 붙여 해당 컨텐츠의 uri 생성( /albumart/앰범 아이디 )

Uri uri = ContentUris.withAppendedId( 앨범아트 uri, 앨범 id );

 

 

URI 에서 바로 읽어 오기

ImageView v.stImageURI( uri );

 

 

 

URI 에서 파일로 읽어 오기

ParcelFileDescriptor fd = getContentResolver().openFileDescriptor( uri, "r" );

Bitmap bitmap = BitmapFactory.decodeFileDescrptor( fd.getFileDescriptor(), null , option );

 

또는,

Bitmap bitmap = Images.Media.getBitmap( mContext.getContentResolver(), uri );

 

 

>> 비디오

비디오는 미디어는 MediaStore.Video.Media , 썸네일은 MediaStore.Video.Thumbnails로 구분되어 있다.

미디어에 썸네일 정보가 없으므로, 썸네일 테이블에서 미디어 id로 검색해 봐야 한다.

 

데이터 취득 절차

MediaStore.Video.Media.EXTERNAL_CONTENT_URI 에서 Media.Video.Media._ID를 select한다.

 

MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI 에서 MediaStore.Video.Thumbnails.DATA 필드를 select 하도록 쿼리한다. where 절은 미디어id MediaStore.Video.Thumbnails.VIDEO_ID 같은 녀석으로.

 

데이터 값

MediaStore.Video.Thumbnails.DATA 에 들어있는 값은 아래와 같다.

/mnt/sdcard/DCIM/.thumbnails/식별번호.jpg

 

URI

ContentUris.withAppendedId( MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, id);

 

바로 읽어오기

비디오와 이미지는 thumbnail 클래스가 별도로 존재하므로, 위의 uri 조차도 만들지 않고, 바로 읽을 수 있게 static 메쏘드도 제공해 주고 있다.

Bitmap bmp = MediaStore.Video.Thumbnails.getThumbnail(

resover,

비디오id,

MediaStore.Video.Thumbnails.MICRO_KIND,

options );

 

 

 

 

>> 이미지

이미지의 미디어는 MediaStore.Images.Media, 썸네일은 MediaStore.Images.Thumbnails 로 구분되어 있다. 

 

 

데이터 취득 절차

MediaStore.Images.Media.EXTERNAL_CONTENT_URI 로 미디어 ID를 SELECT 하고,

MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI 에서 미디어ID와 MediaStore.Images.Thumbnails.IMAGE_ID가 일치하는 녀석으로MediaStore.Images.Thumbnails.DATA를 쿼리한다. 

 

URI

Uri.withAppendedPath( MeidaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, id );

 

바로 읽어오기

Bitmap bmp = MediaStore.Images.Thumbnails.getThumbnail(

resorver,

이미지 id,

MediaStore.Images.Thumbnails.MICRO_KIND,

options);

'프로그래밍 > Android' 카테고리의 다른 글

OpenGL 프레임버퍼 사용  (0) 2011.10.27
ADB tcp/usb 연결설정  (0) 2011.10.26
sdk3.0 fragment를 하위버전에서 사용하기  (0) 2011.10.19
SurfaceView/GLSurfaceView  (0) 2011.10.11
Custom layout, layoutinflater  (0) 2011.10.11
MediaStore 썸네일 데이터 관련 정리  (0) 2011.09.26
뷰의 크기 변경,이동  (0) 2011.09.23
리스트뷰 메쏘드 몇개  (0) 2011.09.22
SQLite Database  (0) 2011.09.20
Edittext 관련 사항들  (0) 2011.09.18
MediaStore 오디오 재생목록  (0) 2011.09.17