android多媒体数据库详解
主要分为⼏节:
1. Android的媒体⽂件内部是如何存储的?
2. Andoid的媒体⽂件如何获取?
3. 在使⽤媒体⽂件的⼀些⼩技巧。
1. Android的多媒体如何存储的?
Android的多媒体⽂件主要存储在/data/data/com.dia/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其实是⼀个视图,真正的⾳频
歌⼿(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表:主要存储歌⼿信息。不多赘述。
其他的⼀些表格我们平时可能⽤的⽐较少,就不做描述了,有兴趣可以⾃⾏研究⼀下。
1. 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.PlaylistsC
olumns 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
video安卓下载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:
MediaStore.Video.Thumbnails 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.Bitmap(ContentResolver cr, Uri url)⽅法,其中ContentResolver是应⽤与资源之间的衔接⼈,它的⽰例通常可以通过在Activity中调⽤
的getContentResolver()⽅法中获取。Uri地址就是上⾯描述的content://media/external/images/media/2类似地址,也就是Content Provider定义的地址形式。
基本⽤法2:从⼀个传统地址中⽣成Bitmap
有时候我们只知道⼀张图⽚的路径,并不知道图⽚的内部地址,想去获取该图⽚,可以采
⽤aphics.BitmapFactory中的decodeXXX⽅法来搞定,⽐如decodeFile⽅法就是从⽂件路径中读取图⽚,原图⽚可以⽀持jpg,png,gif,bmp等各种格式。decodeByteArray就是从字节流中解码了。最后都是转换成Bitmap 格式。
基本⽤法3:获取⼀张图⽚的缩略图
有时候我们需要显⽰图⽚的缩略图,可以采
⽤android.provider.MediaStore.Images.Thumbnails的getThumbnail⽅法。另外其实也可以采
⽤bitmap的compress的⽅法对图⽚进⾏⼀些压缩处理。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。