android 多媒体之 MediaStore 学习记录

1、打开照相机,并将图片存储到  photoUri 路径

Uri photoUri=Uri.fromFile(picFile);
Intent cameraIntent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);

MediaStore.Images.Media.EXTERNAL_CONTENT_URI:content://media/external/images/media

    MediaStore.Images.Media._ID :
    /**
     * The unique ID for a row.
     * 

Type: INTEGER (long)

*/ public static final String _ID = "_id";

android 多媒体之 MediaStore 学习记录_第1张图片


------------------------------------------------------------------------------------------------

本部分摘抄自:android 多媒体数据库详解

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,latitudeDOUBL

E, longitude DOUBLE, datetaken INTEGER, orientation INTEGER, mini_thumb_magic INTEGER, bucket_id TEXT, bucket_display_name TEXT);


2、媒体文件的地址描述方式

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.ThumbnailsgetThumbnail方法。另外其实也可以采用bitmapcompress的方法对图片进行一些压缩处理。

------------------------------------------------------------------------------------------------


获取多媒体资源

public static final Cursor query(ContentResolver cr, Uri uri, String[] projection,String selection, String [] selectionArgs, String orderBy)

解析:

  1. ContentResolver cr ContentResolver是应用与资源之间的衔接人,它的示例通常可以通过在Activity中调用的getContentResolver()方法中获取
  2. Uri uri:前面提到的多媒体文件的第一种地址描述,eg: MediaStore.Images.Media.EXTERNAL_CONTENT_URI  图片的外部库地址
  3. String[] projection:这个参数限定了返回的内容(列Column)。eg: new String[]{ MediaStore.Images.Media.DISPLAY_NAME,MediaStore.Images.Media._ID }  :限定了返回的结果中只包含图片的 DISPLAY_NAME 和 _ID 信息
  4. String selection:设置条件,相当于SQL语句中的where。null表示不进行筛选。eg: MediaStore.Images.Media.DISPLAY_NAME+ "='helloworld'" ,只返回名称为 helloworld 的图片数据。
  5. String [] selectionArgs:这个参数是要配合selection参数使用的,如果你在selection 参数里面有?,那么你在selectionArgs写的数据就会替换掉?,eg:当 selection = MediaStore.Images.Media.DISPLAY_NAME+ “=?” ,selectionArgs= new String[]{"helloworld"}的效果与上个例子是一样的
  6. String orderBy:按照什么进行排序,相当于SQL语句中的Order by。默认排序是升序,+" ASC"写不写效果都一样。如果想要结果按照ID的降序排列:orderBy=MediaStore.Images.Media._ID+" desc " 。
eg:

Cursor cursor = MediaStore.Images.Media.query( getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                                                                    new String[]{ MediaStore.Images.Media.DISPLAY_NAME,MediaStore.Images.Media._ID }  ,null, MediaStore.Images.Media._ID+" desc ");

参考资料:Android 学习笔记 Contacts (一)ContentResolver query 参数详解




学习参考资料:

android 多媒体数据库详解 :http://blog.csdn.net/fengye810130/article/details/11522741


你可能感兴趣的:(android)