主要分為幾節:
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 INTEGER PRIMARY KEY,_data TEXT,_size INTEGER,_display_name TEXT,mime_type TEXT,title
TEXT,date_added INTEGER,date_modified INTEGER,description TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBL
E,longitude DOUBLE,datetaken INTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,bucket_displa
y_name TEXT);
包含了一些基本信息,其中大家一看就明白了。
Thumbnails表:這個表和images表是有直接關系的。主要存儲圖片的縮略圖,Android為每一張保存進系統的圖片文件都會自動生成一張縮略圖文件。關於這一點還有一些特殊的技巧後面再講。我們可以看一下這個表的結構:
CREATE TABLE thumbnails (_id INTEGER PRIMARY KEY,_data TEXT,image_id INTEGER,kind INTEGER,width INTEGER,height INTEGER);
每一張image對應一條thumbnail記錄。
Video表:主要存儲視頻信息了。和images表類似。表結構如下:
CREATE TABLE video (_id INTEGER PRIMARY KEY,_data TEXT NOT NULL,_display_name TEXT,_size INTEGER,mime_type TEXT,date_added INTEGER,date_modified INTEGER,title TEXT,duration INTEGER,artist TEXT,album TEXT,resolution TEXT,description TEXT,isprivate INTEGER,tags TEXT,category TEXT,language TEXT,mini_thumb_data TEXT,latitude DOUBLE,longitude DOUBLE,datetaken INTEGER,mini_thumb_magic INTEGER, bucket_id TEXT, bucket_display_name TEXT, bookmark INTEGER);
Videothumbnails表:存儲視頻的縮略圖信息。這個和thumbnails表類似。
Audio表:音頻信息比視頻信息和圖片信息要稍微復雜一些,主要是存儲了一些專輯(album)、歌手(artists)信息,而專輯和歌手信息是單獨的表格存儲的,audio其實是一個視圖,真正的音頻數據信息存儲在audio_meta表格中。我們可以看一下audio視圖的定義:
CREATE VIEW audio as SELECT * FROM audio_meta LEFT OUTER JOIN artists ON audio_meta.artist_id=artists.artist_id LEFT 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(ContentResolvercr,Uriurl)方法,其中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的方法對圖片進行一些壓縮處理。