你的位置:無名小站 \ 分类:Android \ 文章正文

【转】Android媒体的一些使用总结

Heller 于 2011年12月22日 17:17:46 周四


 

主要分为几节:

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 (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 的方法对图片进行一些压缩处理。

标签:android  媒体  Media  Store  
« 上一篇:没有了
脑筋急转弯:下一篇»

引用地址:

说说看:(点击这里申请属于你的个性头像)

(*)

日历
博主
分类
随机日志
链接
信息
  • 日志数量:128
  • 评论数量:48
  • 引用数量:0
  • 今日访问:113
  • 总访问量:515733
Online Translation
Q我吧
  • Q我吧