轉載地址為:http://blog.csdn.net/xingtian713/article/details/6458150
http://blog.csdn.net/xingtian713/article/details/6525411
主要分為幾節:
1. Android的媒體檔案內部是如何儲存的?
2. Andoid的媒體檔案如何擷取?
3. 在使用媒體檔案的一些小技巧。
1. Android的多媒體如何儲存的?
Android的多媒體檔案主要儲存在/data/data/com.android.providers.media/databases目錄下,該目錄下有兩個db檔案,一個是內部儲存資料庫檔案(internal.db),一個是儲存卡資料庫(external-XXXX.db)。媒體檔案的操作主要是圍繞著這兩個資料庫來進行。這兩個資料庫的結構是完全一模一樣的。
我們先看一下這兩個資料庫包含了哪些表。
album_art
audio search
album_info
audio_genres searchhelpertitle
albums
audio_genres_map thumbnails
android_metadata
audio_meta video
artist_info
audio_playlists videothumbnails
artists
audio_playlists_map
artists_albums_map
images
先從基本的分析:
Images表:主要儲存images資訊。可以看一下這個表的結構:
CREATE TABLE images (_id INTEGERPRIMARY KEY,_data TEXT,_size INTEGER,_display_name TEXT,mime_type TEXT,title
TEXT,date_added INTEGER,date_modifiedINTEGER,description TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBL
E,longitude DOUBLE,datetakenINTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,bucket_displa
y_name TEXT);
包含了一些基本資料,其中大家一看就明白了。
Thumbnails表:這個表和images表是有直接關係的。主要儲存圖片的縮圖,Android為每一張儲存進系統的圖片檔案都會自動產生一張縮圖檔案。關於這一點還有一些特殊的技巧後面再講。我們可以看一下這個表的結構:
CREATE TABLE thumbnails (_id INTEGERPRIMARY KEY,_data TEXT,image_id INTEGER,kind INTEGER,width INTEGER,height
INTEGER);
每一張image對應一條thumbnail記錄。
Video表:主要儲存視頻資訊了。和images表類似。表結構如下:
CREATE TABLE video (_id INTEGERPRIMARY KEY,_data TEXT NOT NULL,_display_name TEXT,_size INTEGER,mime_typeTEXT,date_added INTEGER,date_modified INTEGER,title TEXT,durationINTEGER,artist TEXT,album TEXT,resolution
TEXT,description TEXT,isprivateINTEGER,tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,latitudeDOUBLE,longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER, bucket_idTEXT, bucket_display_name TEXT, bookmark INTEGER);
Videothumbnails表:儲存視頻的縮圖資訊。這個和thumbnails表類似。
Audio表:音頻資訊比視頻資訊和圖片資訊要稍微複雜一些,主要是儲存了一些專輯(album)、歌手(artists)資訊,而專輯和歌手資訊是單獨的Table Store的,audio其實是一個視圖,真正的音頻資料資訊儲存在audio_meta表格中。我們可以看一下audio視圖的定義:
CREATE VIEW audio as SELECT * FROMaudio_meta LEFT OUTER JOIN artists ON audio_meta.artist_id=artists.artist_idLEFT OUTER JOIN albums ON audio_meta.album_id=albums.album_id;
Albums表:主要儲存專輯資訊。
Artists表:主要儲存歌手資訊。不多贅述。
其他的一些表格我們平時可能用的比較少,就不做描述了,有興趣可以自行研究一下。
2. Android的多媒體如何擷取?
Android提供了媒體擷取與儲存的相關API,主要包含在android.provider.MediaStorepackage中。
MediaStore.Audio.AlbumColumns |
Columns representing an album |
MediaStore.Audio.ArtistColumns |
Columns representing an artist |
MediaStore.Audio.AudioColumns |
Columns for audio file that show up in multiple tables. |
MediaStore.Audio.GenresColumns |
Columns representing an audio genre |
MediaStore.Audio.PlaylistsColumns |
Columns representing a playlist |
MediaStore.Files.FileColumns |
Fields for master table for all media files. |
MediaStore.Images.ImageColumns |
|
MediaStore.MediaColumns |
Common fields for most MediaProvider tables |
MediaStore.Video.VideoColumns |
|
MediaStore |
The Media provider contains meta data for all available media on both internal and external storage devices. |
MediaStore.Audio |
Container for all audio content. |
MediaStore.Audio.Albums |
Contains artists for audio files |
MediaStore.Audio.Artists |
Contains artists for audio files |
MediaStore.Audio.Artists.Albums |
Sub-directory of each artist containing all albums on which a song by the artist appears. |
MediaStore.Audio.Genres |
Contains all genres for audio files |
MediaStore.Audio.Genres.Members |
Sub-directory of each genre containing all members. |
MediaStore.Audio.Media |
|
MediaStore.Audio.Playlists |
Contains playlists for audio files |
MediaStore.Audio.Playlists.Members |
Sub-directory of each playlist containing all members. |
MediaStore.Files |
Media provider table containing an index of all files in the media storage, including non-media files. |
MediaStore.Images |
Contains meta data for all available images. |
MediaStore.Images.Media |
|
MediaStore.Images.Thumbnails |
This class allows developers to query and get two kinds of thumbnails: MINI_KIND: 512 x 384 thumbnail MICRO_KIND: 96 x 96 thumbnail |
MediaStore.Video |
|
MediaStore.Video.Media |
|
MediaStore.Video.Thumbnails |
This class allows developers to query and get two kinds of thumbnails: MINI_KIND: 512 x 384 thumbnail MICRO_KIND: 96 x 96 thumbnail |
簡單的觀察一下,發現這些類也就是對資料庫中的一些表的封裝,弄懂了底層的儲存結構,對於瞭解這些類的作用就很容易了。
Android系統中的每一種媒體檔案有兩種地址描述方式。
第一種模式,大家知道,在Android中,Content Provider是用來儲存和擷取公用資料的統一介面,Content Provider為每一類資源分派了URI地址,比片的地址就包括MediaStore.Images.Media.INTERNAL_CONTENT_URI和MediaStore.Images.Media.EXTERNAL_CONTENT_URI兩個基礎地址,其值分別是content://media/internal/images/media和content://media/external/images/media,對應內部庫和外部庫地址。每一張圖片的地址基本上是上面的基礎URL地址下加片的內部ID。打個比方一張儲存卡上的圖片ID為2,其對應的Uri地址就是content://media/external/images/media/2.知道了這個地址,基本上就可以操作這張圖片的所有資訊了。
另外一種描述檔案地址標識就是傳統的檔案路徑模式了,比如一張儲存卡上的圖片地址可能描述為:/mnt/sdcard/images/1.jpg。其實這個路徑儲存在images表格中的data欄位中,有了這點關聯,我們可以在這兩種模式下進行任意切換。
前一種模式下,主要通過MediaStore.Images.Media、MediaStore.Audio.Media、MediaStore.Video.Media三個庫中的query方法來查詢或者擷取特定條件的媒體了。
基本用法1:從一個Content Uri地址中產生Bitmap
可以採用android.provider.MediaStore.Images.Media.getBitmap(ContentResolver cr, Uri url)方法,其中ContentResolver是應用與資源之間的銜接人,它的樣本通常可以通過在Activity中調用的getContentResolver()方法中擷取。Uri地址就是上面描述的content://media/external/images/media/2類似地址,也就是Content Provider定義的地址形式。
基本用法2:從一個傳統地址中產生Bitmap
有時候我們只知道一張圖片的路徑,並不知道圖片的內部地址,想去擷取該圖片,可以採用android.graphics.BitmapFactory中的decodeXXX方法來搞定,比如decodeFile方法就是從檔案路徑中讀取圖片,原圖片可以支援jpg,png,gif,bmp等各種格式。decodeByteArray就是從位元組流中解碼了。最後都是轉換成Bitmap格式。
基本用法3:擷取一張圖片的縮圖
有時候我們需要顯示圖片的縮圖,可以採用android.provider.MediaStore.Images.Thumbnails的getThumbnail方法。另外其實也可以採用bitmap的compress的方法對圖片進行一些壓縮處理。