MediaScanner与音乐信息扫描

Android系统在SD卡插入后,MediaScanner服务会在后台自动扫描SD上的文件资源,将SD上的音乐媒体信息加入到MediaStore数据库中。程序可以直接从MediaStore中读取相应的媒体信息。通过注册监听MediaScanner广播的Intent,可以获知MediaScanner服务是否在进行后台的扫描工作:

Intent.ACTION_MEDIA_SCANNER_STARTED 表示MeidaScanner开始扫描;
       Intent.ACTION_MEDIA_SCANNER_FINISHED 表示MediaScanner扫描结束;
       当程序从网络下载媒体文件到终端后,MediaScanner服务并不会自动扫描刚刚下载的文件,需要程序主动去扫描这些新添加的媒体文件信息到MediaStore数据库中。在Android系统中有两种方式去主动扫描音乐媒体文件信息到
MediaStore数据库:

  1.启动MediaScanner服务,扫描媒体文件:
       程序通过发送下面的Intent启动MediaScanner服务扫描指定的文件或目录:
       Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描指定文件

java代码:

  1. public void scanFileAsync(Context ctx, String filePath) {
  2. Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  3. scanIntent.setData(Uri.fromFile(new File(filePath)));
  4. ctx.sendBroadcast(scanIntent);
  5. }

复制代码

“android.intent.action.MEDIA_SCANNER_SCAN_DIR”:扫描指定目录

java代码:

  1. public static final String ACTION_MEDIA_SCANNER_SCAN_DIR = "android.intent.action.MEDIA_SCANNER_SCAN_DIR";
  2. public void scanDirAsync(Context ctx, String dir) {
  3. Intent scanIntent = new Intent(ACTION_MEDIA_SCANNER_SCAN_DIR);
  4. scanIntent.setData(Uri.fromFile(new File(dir)));
  5. ctx.sendBroadcast(scanIntent);
  6. }

复制代码

这种扫描方式中,由于扫描工作是在MediaScanner服务中进行的,因此不会阻塞当前程序进程。当扫描大量媒体文件且实时性要求不高的情况下,适合使用该扫描方式。

2.通过MediaScanner提供的API接口,扫描媒体文件。
       这种扫描媒体文件的方式是同步的,扫描工作将会阻塞当前的程序进程。当扫描少量文件,且要求立即获取扫描结果的情况下,适合使用该扫描方式。
       在扫描媒体文件前,程序应该根据终端当前的语言环境正确设置MediaScanner的语言环境设置, 避免产生编解码的错误:

java代码:

  1. MediaScanner scanner = new MediaScanner(ctx);
  2. Locale locale = ctx.getResources().getConfiguration().locale;
  3. String language = locale.getLanguage();
  4. String country = locale.getCountry();
  5. scanner.setLocale(language + \"_\" + country);

复制代码

媒体文件可以存储在手机终端的内存中,也可以存储在SD卡中,Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间。针对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理。因此在扫描媒体文件时,要明确指明扫描的媒体文件是位于内部存储空间还是外部存储空间。外部存储空间和内部存储空间对应的卷标为”external”和”internal”。

java代码:

  1. scanner.scanSingleFile(filePath, volumeName, mimeType);
  2. scanner.scanDirectories(directories, volumeName);
复制代码
 
 
 
MediaStore与音乐信息查询
       MediaScanner将扫描媒体文件获得的信息全部存储在MediaStore数据库中。MediaStore是基于SQLite数据库系统的,通过ContentProvider方式,程序可以对MediaStore数据库进行增删查改等操作。

MediaStore的数据库文件位于/data/data/com.android.providers/databases, 通常可以发现两个数据库文件
internal.db:对应内部存储空间的媒体数据库文件;
       external-xxxxxxxx.db:对应外部存储空间的媒体数据文件,由于同一个手机终端可能使用多个SD卡,针对每一个SD卡,OPhone平台都会生成对应的媒体数据库文件。

两个数据库文件除了管理的文件所存储的位置不同外,没有其他区别。本文后续将默认以外部存储为例进行介绍。

使用SQLite命令打开数据库文件,可以看到Android多媒体数据库的基本结构:
        >sqlite3 external-xxx.db
        >.tables
        >.schema
        感兴趣的读者可以自己查看,本文不再一一列举。

MediaStore类是Android平台的多媒体数据库,它包含了音频,视频,图片等所有多媒体文件信息。本文将重点介绍如何管理和获取音频信息,视频和图片等信息的获取与管理与音频类似。

MediaStore以ContentProvider的形式向外提供媒体数据库信息。通过Android平台提供的ContentProvider接口,可以方便的访问数据库信息。

java代码:

  1. public Cursor query(Contex ctx, Uri _uri, String[] prjs, String selections, String[] selectArgs, String order) {
  2. ContentResolver resolver = ctx.getContentResolver();
  3. if (resolver == null) {
  4. return null;
  5. }
  6. return resolver.query(_uri, prjs, selections, selectArgs, order);
  7. }

复制代码

_uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考SDK开发文档。

prjs: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。
       selection: 指定查询条件
       selectionArgs:参数selection里有?这个符号时,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null
       order:指定查询结果的排列顺序
       MediaStore.Audio.Media类定义了媒体数据库中的歌曲信息
       MediaStore.Audio.Artists类定义了媒体数据库中的歌手信息
       MediaStore.Audio.Albums类定义了媒体数据库中的专辑信息
       MediaStore.Audio.Playlists类定义了媒体数据库中的播放列表信息

读者可以通过OPhone SDK开发文档找到详细的信息,结合ContentProvider的查询接口,可以获取所有媒体信息。
       MediaPlayer与音乐播放MediaPlayer是Android多媒体编程中最核心的类。它提供了一个多媒体播放器常用的基本操作如播放,暂停,停止,获取文件播放长度等等。它向下通过JNI封装,获取系统提供的多媒体播放能力。

MeidaPlayer提供了设计良好的多媒体接口,播放一个音频文件的步骤非常简单:
       1.创建播放器: new MediaPlayer()
       2.设置音频源: setDataSource(Audio_PATH)
       3.准备音频源: prepare()
       4.播放音频: start()
       5.停止播放: stop()
       6.释放资源: release();

其他MediaPlayer常用接口例如pause(), getDuration(), seekTo()等,大家可以自己查阅SDK文档,这里不在一一介绍。
       音频的播放过程也就是MediaPlayer对象的状态转换过程。深入理解MediaPlayer的状态机是灵活驾驭Android多媒体编程的基础。读者在Android SDK 开发文档中可以查看到MediaPlayer的状态转换图。程序有必要监听这些变化,判断播放器所处的状态,Android平台提供了多种监听器,来监视 MediaPlayer的状态变化:
        MediaPlayer.OnBufferingUpdateListener
        MediaPlayer.OnCompletionListener
        MediaPlayer.OnErrorListener
        MediaPlayer.OnPreparedListener
        MediaPlayer.OnSeekCompleteListener

Android平台可以从资源文件、文件系统和网络三种方式来播放多媒体文件。无论使用哪种播放方式,基本的流程都是类似的。

从资源文件播放
       多媒体文件可以放在资源文件夹/res/raw目录下,然后通过MediaPlayer.create(Context ctx, int file)方法创建MediaPlayer对象,获得MediaPlayer对象后直接调用start()方法即可播放音乐。
       从文件系统播放
       从文件系统播放音乐,需要使用new操作符创建MediaPlayer对象。获得MediaPlayer对象之后,需要依次调用setDataSource() 和prepare()方法,以便设置数据源,让播放器完成准备工作,然后调用start()方法播放音乐。

从网络播放
       Android平台支持在线播放媒体音乐,通过 progress download的方式播放在线音频资源。Progress download的支持由底层的OpenCore多媒体库提供支持,应用开发者不必关心具体实现细节,只需要设置网络音频资源的地址,就可以完成在线播放的工作,极大提高了开发效率。由于从网络下载播放音频资源需要较长的时间,在准备音频资源的时候,需要使用prepareAsync()方法,这个方法是异步执行的,不会阻塞程序的主进程。MediaPlayer通过MediaPlayer.OnPreparedListener通知 MediaPlayer的准备状态。

在特定的情况下,程序需要通过代理服务器访问在线资源,例如,通过APN CMWAP访问网络时,需要设置CMWAP的代理地址(10.0.0.172:80)。Android平台提供了非常方便的解决方案,使开发者可以非常简单的通知OpenCore使用指定的代理来访问网络音频资源:在网络媒体的url后,通过“x-http-proxy”指定代理服务器地址。另外,由于 Android平台支持Multi PDP,可以同时建立多个APN连接,所以开发者必须指明哪个连接端口需要使用代理服务器,通过“x-net-interface”指定连接端口,下面的程序简单说明了通过代理服务器播放音频资源的步骤:

java代码:

  1. private void playFromNetwork() {
  2. String path = "http://website/path/test.mp3";
  3. String CMWAP_HOST = "10.0.0.172";
  4. String CMWAP_PORT = "80";
  5. //假设CMWAP连接的端口名
  6. String SOCKET_INTERFACE = "cminnet0";
  7. String urlWithProxy = path + "?x-http-proxy=" + CMWAP_HOST + ":" + CMWAP_PORT + "&" + "x-net-interface=" + SOCKET_INTERFACE ;
  8. try {
  9. MediaPlayer player = new MediaPlayer();
  10. player.setDataSource(path);
  11. player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  12. public void onPrepared(MediaPlayer player) {
  13. player.start();
  14. }
  15. });
  16. player.prepareAsync();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
复制代码
 
 
原文转自:http://www.eoeandroid.com/thread-98713-1-1.html

Android 音乐资源管理与播放相关推荐

  1. Android音乐浮窗播放器

    这是来到公司的第一个小项目.做一个音乐播放器,内容如下 Float Music(浮窗音乐播放器) 考点: 服务, 音乐播放, 浮窗界面, 列表界面, 自定义view, 手势操作 功能描述: 1.音乐列 ...

  2. Android音乐播放器的设计与实现

    课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...

  3. 简单android音乐播放器课程设计,android音乐播放器课程设计报告.doc

    android音乐播放器课程设计报告 android音乐播放器课程设计报告 基于Android音乐播放器的设计与实现 滨江学院 <移动通信程序设计> 课程设计 题 目 院 系 专 业学生姓 ...

  4. android import找不到文件夹,android 音乐播放器找不到源文件

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 package com.example.frame.a123; import android.app.Service; import android.co ...

  5. android音乐播放器完整教程,android实现简单音乐播放器

    本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...

  6. 自编Win8风格Android音乐播放器应用源码(单机版)

    用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能: 注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡( ...

  7. Android音乐播放器高级开发

    获取手机音乐的信息 1. 先在布局文件中添加一个ListView <ListView xmlns:android="http://schemas.android.com/apk/res ...

  8. Android 音乐APP(五)音乐通知栏、后台播放音乐

    Android 音乐通知栏 前言 正文 ① 通知栏按钮点击监听 ② 通知栏点击监听 ③ 通知栏业务处理 ④ 运行效果图 结语 前言   这篇文章的标题有些言简意赅了,也突出了这篇文章的核心,那就是通知 ...

  9. Android音乐播放器的比较。

    转自http://www.chinaz.com/mobile/2012/0120/232745_3.shtml 播放界面设计评价 可以看出在这个注重视觉的时代,手机上的音乐播放器的整体风格上也大都不约 ...

  10. Android音乐播放模式切换-外放、听筒、耳机

    Android音乐播放模式切换-外放.听筒.耳机 https://blog.csdn.net/u010936731/article/details/70599482/ 场景需求 在聊天场景中,收到对方 ...

最新文章

  1. DateTime.Ticks 属性
  2. 常见服务器解析漏洞(IIS,Nginx,Apache)
  3. 64位Visual Studio 2022,微软在下一盘大棋!
  4. LwIP tcp/ip socket编程listen函数分析
  5. 【Level 08】U07 Mixed Feelings L6 State of the Nation
  6. 连接池和 Timeout expired异常【转】
  7. mybatis核心数据结构详解——CacheKey
  8. MFC文件的读写操作,类的序列化与反序列化,CFile,CFileDialog,CArchive,CStdioFile
  9. js基础-16-继承
  10. 概率论中几个入门公式
  11. 怎么禁用计算机usb驱动程序,win7如何禁止USB自动安装驱动程序
  12. Mac 安装 idb 和 idb_companion
  13. 验证英文日期格式的正则表达式
  14. unity3d学习笔记——老版动画系统的使用
  15. String Similarity
  16. [MATLAB App Designer] 多窗口 App 中的交互(含数据传递)
  17. 动手学深度学习:3.16 实战Kaggle比赛:房价预测
  18. [转载] 厘米转像素
  19. understand学习
  20. fMRI数据处理_预处理_1_流程及脚本

热门文章

  1. 休假管理系统的问题描述与词汇表
  2. Unity3D FPS游戏之子弹贴图
  3. 甘特图、IPO图、DFD图
  4. 友盟,听云统计到的crash如何定位
  5. 3D世界 ORGE SceneManager GetStart
  6. R485集线器定协议有多少种能否抗干扰?
  7. 算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)
  8. wiz为知笔记docker部署与数据迁移
  9. Visual studio 2015(VS2015)的下载和安装,以及安装VS2015中的C++
  10. 电脑桌面老是弹出计算机,电脑桌面老是弹出游戏怎么解决