android 多媒体数据库详解
主要分为几节:
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的方法对图片进行一些压缩处理。
android 多媒体数据库详解的更多相关文章
- android 多媒体数据库详解(转)
转自:http://www.2cto.com/kf/201309/242876.html 主要分为几节: 1. Android的媒体文件内部是如何存储的? 2. Andoid的媒体文件如何获取? 3. ...
- Android系统目录结构详解
Android系统基于linux内核.JAVA应用,算是一个小巧精致的系统.虽是开源,但不像Linux一般庞大,娇小可亲,于是国内厂商纷纷开发出自己基于Android的操作系统.在此呼吁各大厂商眼光放 ...
- Android SDK Manager详解
Android基础知识——Android SDK Manager详解 做Android开发时,免不了使用Android SDK Manager,安装需要的sdk版本.buildTools版本等等. ...
- JMessage Android 端开发详解
目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 IM 应用会需要有哪些功能? 用户注册 / 登 ...
- android:ToolBar详解
android:ToolBar详解(手把手教程) 泡在网上的日子 发表于 2014-11-18 12:49 第 124857 次阅读 ToolBar 42 来源 http://blog.mosil.b ...
- atitit.mp4 视频文件多媒体格式结构详解
atitit.mp4 视频文件多媒体格式结构详解 1. 一.基本概念1 2. MP4文件概述2 3. mp4是由一个个“box”组成的,2 4. 典型简化mp43 5. Fragments5 6. r ...
- Android之canvas详解
首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...
- 【转】Android Canvas绘图详解(图文)
转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...
- (转)phonegap 数据库详解
原文:http://firepix.iteye.com/blog/1618343 phonegap 数据库详解 博客分类: web App phonegap 今天就把之前使用pho ...
随机推荐
- 四级流水线的8bit加法器
以流水线实现8bit 加法器. //date : 2013/8/23 //designer :pengxiaoen //function : module pipeline ( clock ,rese ...
- docker学习笔记11:Dockerfile 指令 CMD介绍
我们知道,通过docker run 创建并启动一个容器时,命令的最后可以指定容器启动后在容器内立即要执行的指令,如: docker run -i -t ubunu /bin/bash //表示容器 ...
- [置顶] 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面
[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...
- Android SurfaceView实战 带你玩转flabby bird (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...
- Cocos2d-x 3.0final手机游戏开发视频教程2014 - 自学编程 -(陆续更新中)
内容: 非常多人问我:沈老师,要不要更新引擎版本号到3.0,更新这么快,以后会不会每一个月都有一次,好怕呀. 我说:无论你曾经是哪个版本号,3.0final是一个架构级别的升级,能够在新项目中果断升级 ...
- JQuery - 提交表单
[JavaScript] JQuery异步提交表单与文件上传 Jquery.form.js是一个可以异步提交表单及上传文件的插件. 文档地址:http://jquery.malsup.com/form ...
- linux中如何修改文件夹的用户权限 chown命令
linux中,可以使用chown命令来修改文件夹的用户权限. 1. 以普通用户 A 登录linux,利用su -切换到root用户 2. 在root用户下,可以看到文件夹内容 3. 但通过文件系统, ...
- 演练5-2:Contoso大学校园管理2
一.添加列标题排序功能 我们将增加Student/Index页面的功能,为列标题添加超链接,用户可以点击列标题对那一列进行排序. 1.修改Index方法 public ActionResult Ind ...
- centos安装python gcc sqlite
终端中输入命令:yum install gcc -y yum install python -y yum install sqlite -y
- httplib,urllib和urllib2
一.httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现. import httplib con ...