`

Android多媒体

 
阅读更多

转于:http://www.cnblogs.com/wanqieddy/archive/2011/07/12/2104077.html

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

通过调用Android的API,可以实现相册,播放器,录音和摄像等功能。这一章需要掌握如下功能:

q      多媒体的ContentProvider的调用

q      Camera

q      AudioRecord和AudioTrack

q      MediaPlayer

  11.1  获取多媒体信息

多媒体信息?在pc中的音乐播放器总是很容易的显示歌手名、歌曲名、专辑名、年代。在Android中应该如何获取这些信息呢?

11.1.1  查看多媒体ContentProvider

前面我们学习了ContentProvider来保存和检索数据,Android为常用的数据类型(如:音视频、图片和联系方式等)提供了大量的ContentProvider,它们被定义在android.provider包下。那么我们如何获取多媒体的ContentProvider呢。

(1)       在Eclipse中添加Android自带的FileExplorer视图:

菜单栏->window->show view->other->Android->FileExplorer

(2)       开启模拟器,在FileExplorer中查看data/data/com.android.providers.media/databases/(如图11.1)

(3)       将external.db文件 pull到pc上,用sqlite工具(可以使用火狐插件SQliteManager)查看:(如图11.2)

(4)       查看表结构:

audio_meta:管理sd卡中的音频资源。(如图11.3)

video:管理sd卡中的视频资源。(如图11.4)

images:管理sd卡中的图片。(如图11.5)

 

 

图11.1  多媒体数据库所在包

 

图11.2  多媒体数据库表

 

 

图11.3  音频表结构(audio_meta)

 

图11.4  视频表结构(video)

 

图11.5  图片表结构(images)

可能大家看到这里会不明白为什么讲多媒体先要介绍这些。笔者这里给大家列举一个音乐播放器的需求:

1)      获得音乐文件列表及路径

2)      获得音乐文件属性(歌曲名、歌手名、专辑、年代。。)

3)      手动删除内存卡中音乐文件,如何能同步更新文件列表

如果是没有Android经验,大家可能会这样分析:

       文件路径嘛,我调用file.listFile()就可以得到音乐文件列表。如果内存卡里有很多文件,那么这个将会特别的耗时,如果让用户等上10秒去扫描存储卡,用户很有可能将你的应用卸载掉。

       音乐文件属性一般保存在音乐文件中,有的放在文件头,有的放在文件尾,必须读出该文件相关字节中的内容才可以获取音乐文件信息。OK,有个开源的项目,可以解析MP3文件中的文件信息。但是它同样也是耗时的操作。而且学会调用这个开源项目还需要一周的时间。做一个项目没那么难吧?

       在文件管理器中手动删除或添加一个音乐文件,这个时候如何把它更新到音乐列表中呢,当你选择一首歌播放的时候,很有可能已经被删掉了。总不能让它时刻去调用file.listFile()去维护吧?

       那么我们到底应该怎么做呢?你要始终相信Android是强大的,它早已为我们提供了这些功能,我们只需要调用Android提供的API,就可以解决上述的需求。

       现在我们先看个图,图11.6为模拟器开机时,在log中打印的日志。

 

图11.6  开机时的log

大家会看到,系统会调用MediaScanner去扫描Internal和External Volume。原来,在开机时,系统会在后台扫描内存和外存设备,将多媒体数据更新到数据库中。同时也会扫描文件信息,这样,我们不费吹灰之力就解决了问题。

小插曲:之前由于笔者还不知道这个方法,在摸索中让同事去研究解析MP3文件信息,花了他一个星期时间,当他做出来了,我花了十分钟找到了这个方法。真是罪过罪过。

那么我们如何得到多媒体数据呢,请看下面的例子:

/**

      * 读取sd卡中的音乐文件

      * @return

      * @throws Exception

      */

     public static ArrayList<Song> readDataFromSD(Context context,int component){

//       Log.i(TAG, "scanFile");

         Cursor cursor = context.getContentResolver().query(

                   MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,

                   new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.YEAR, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.DATA}

                   , MediaStore.Audio.Media.MIME_TYPE+"=? or " + MediaStore.Audio.Media.MIME_TYPE+"=?", new String[]{"audio/mpeg","audio/x-ms-wma"},null);

         ArrayList<Song> songs = null;

         if (cursor.moveToFirst()) {

              songs = SongInfoUtil.getList(cursor, context, component);

         }

         return songs;

     }

 

 

/**

 * @author stayzhang 封装信息至Song

 */

public class SongInfoUtil {

//   private static final String TAG = "ListUtils";

     public static ArrayList<Song> getList(Cursor cursor, Context mContext, int component) {

         Song song = null;

         do {

//            Log.i(TAG, "getList");

              song = new Song();

              song.setFilename(cursor.getString(1));//文件名

              song.setTitle(cursor.getString(2));//歌曲名

              song.setDuration(cursor.getInt(3));//时长

              song.setSinger(cursor.getString(4));//歌手名

              song.setAlbum(cursor.getString(5));//专辑名

              if (cursor.getString(6) != null) {//年代

                   song.setYear(cursor.getString(6));

              } else {

                   song.setYear("未知");

              }

              if ("audio/mpeg".equals(cursor.getString(7).trim())) {//歌曲格式

                   song.setType("mp3");

              } else if ("audio/x-ms-wma".equals(cursor.getString(7).trim())) {

                   song.setType("wma");

              }

              if (cursor.getString(8) != null) {//文件大小

                   float temp = cursor.getInt(8) / 1024f / 1024f;

                   String sizeStr = (temp + "").substring(0, 4);

                   song.setSize(sizeStr + "M");

              } else {

                   song.setSize("未知");

              }

              if (cursor.getString(9) != null) {//文件路径

                   song.setFileUrl(cursor.getString(9));

              }

         } while (cursor.moveToNext());

         cursor.close();

         return dbService.query(component, null, null);

     }

}

同理,图片还有视频文件也可以这样获得,不再赘述。

这样第一个和第二个需求我们已经解决,那第三个需求呢。

当我们手动的删除或添加多媒体文件到存储卡中时,Android会自动扫描这些文件并将其更新到数据库吗?

答案是不会,那么我们如何将数据实时更新到数据库中呢。还记得logcat中打印出来的MediaScanner吗?我们也可以调用MediaScanner这个类去扫描存储卡。但是不能直接调用这个类,只能以广播的形式通知系统,让系统去扫描存储卡指定的URI,扫描完后,再通过ContentProvider查询数据库。

方法如下:

/**

          * 调用系统api扫描sd卡

          */

         private void scanSdCard() {

                   IntentFilter intentFilter = new IntentFilter(

                                     Intent.ACTION_MEDIA_SCANNER_STARTED);

                   intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);

                   intentFilter.addDataScheme("file");

                   scanReceiver = new ScanSdFilesReceiver();

                   registerReceiver(scanReceiver, intentFilter);

                   sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,

                                     Uri.parse("file://" + getExternalStorageDirectory().getAbsolutePath)));

         }

 

         /**

          * @author stayzhang 注册扫描开始/完成的广播

          */

         private class ScanSdFilesReceiver extends BroadcastReceiver {

                   public void onReceive(Context context, Intent intent) {

                            String action = intent.getAction();

                            if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)) {

//当系统开始扫描sd卡时,为了用户体验,可以加上一个等待框

                                     scanHandler.sendEmptyMessage(STARTED);

                            }

                            if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {

                            //当系统扫描完毕时,停止显示等待框,并重新查询ContentProvider

                                     scanHandler.sendEmptyMessage(FINISHED);

                            }

                   }

         }

OK,关于多媒体的ContentProvider的知识告一段落,下面就是如何调用Android API来使用这些多媒体文件。

分享到:
评论

相关推荐

    android多媒体框架详细分析

    ### Android多媒体框架详细分析 #### 一、摘要 本文旨在深入剖析Android系统的多媒体架构,并重点关注其内部机制,尤其是OpenCore的工作原理。通过本篇分析,读者将了解到Android多媒体架构的层次结构、各组件间的...

    Android多媒体构架分析

    在深入分析Android多媒体构架之前,我们必须先了解Android系统作为一个整体是如何处理多媒体信息的。Android多媒体构架是一套复杂的系统,它涵盖了音频、视频、图形和图像的捕获、处理和播放。本分析报告将侧重于Ice...

    Android多媒体框架分析.pdf

    Android 多媒体框架分析 Android 多媒体框架是 Android 系统中负责处理多媒体任务的核心组件,包括音频、视频、图像等多媒体数据的处理和播放。基于 PacketVideo 公司的 OpenCORE 平台,多媒体框架提供了一套通用的...

    android多媒体框架分析

    这篇博客"android多媒体框架分析"将深入探讨这一领域,旨在帮助开发者理解和优化多媒体应用的性能。由于没有具体的描述,我们将根据标题和标签来推测文章可能涵盖的关键知识点。 1. **多媒体框架概述**: Android...

    android多媒体

    Android多媒体框架是Android操作系统的核心组成部分之一,主要负责处理音频、视频和图像等多媒体内容的编码、解码、播放和显示。这个框架的构建基于Android系统的五大部分:Linux Kernel、Android Runtime、...

    Android多媒体框架.pdf

    ### Android多媒体框架知识点详解 #### 一、概览 **标题**:“Android多媒体框架.pdf”这一文档主要聚焦于Android系统中的多媒体框架,旨在为开发者提供深入理解与掌握Android平台多媒体功能的技术指南。 **描述*...

    Android多媒体框架初步分析

    Android多媒体框架是Android系统中处理音频、视频和图像的核心组件,为开发者提供了强大的多媒体功能支持。这个框架位于Android系统的Libraries层,主要由C/C++编写,并通过JNI(Java Native Interface)与Java层...

    Android多媒体编程代码实例

    在Android平台上进行多媒体编程是一...通过理解和掌握以上知识点,开发者可以构建出功能丰富的Android多媒体应用,为用户提供丰富的视听体验。在实际开发中,应结合具体需求灵活运用,同时注意性能优化和用户体验设计。

    Android多媒体应用开发实战详解:图像、音频、视频、2D和3D

    理解多媒体API的工作原理,以及如何优化性能和用户体验,是开发高质量Android多媒体应用的关键。 总结,Android多媒体应用开发涉及到图像处理、音频和视频操作,以及2D和3D图形渲染等多个层面。开发者需要深入理解...

    《Android多媒体编程从初学到精通].苗忠良等.扫描版.pdf》

    《Android多媒体编程从初学到精通》是一本专为Android开发者设计的书籍,旨在帮助读者深入理解和熟练掌握在Android平台上进行多媒体编程的各种技术和实践。作者苗忠良等人通过丰富的实例和详细讲解,引领读者逐步...

    Android 多媒体文件选择器

    **Android 多媒体文件选择器详解** 在移动应用开发中,提供用户选择多媒体文件(如图片和视频)的功能是常见的需求。"Android 多媒体文件选择器" 是一个专为此目的设计的开源解决方案,由 getchute.com 开发,并且...

    Android多媒体开发04-框架.ppt

    【Android多媒体框架与开发应用框架】 在Android系统中,多媒体框架是实现音频、视频和图像处理的核心组件,而应用框架则是开发者构建应用程序的基础。本文将深入解析这两个关键领域的概念和工作原理。 一、...

Global site tag (gtag.js) - Google Analytics