主要分為幾節: 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表:主要存儲歌手信息。不多贅述。 其他的一些表格我們平時可能用的比較少,就不做描述了,有興趣可以自行研究一下。
Android提供了媒體獲取與存儲的相關API,主要包含在android.provider.MediaStorepackage中。
簡單的觀察一下,發現這些類也就是對數據庫中的一些表的封裝,弄懂了底層的存儲結構,對於了解這些類的作用就很容易了。 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的方法對圖片進行一些壓縮處理。 |