在一个人经过艰苦奋斗终于做出一件像样点的作品之后,我的心情那是飞一般的感觉。不过现在回想起自己在制作作品的过程中,遇到的种种困境、解决问题的方法、分析问题的过程的时候,那些东西可是刻骨铭心的。这些所有的东西都见证了我的进步。
第一,音频文件的搜索与播放:
先讲音频文件的播放,这个比较容易,在做高德之前,我已经做过音频播放的测试。音频播放有两种方法,第一种方式代码如下
public void playMusic(){ MediaPlayer myMediaPlayer = null; if(myMediaPlayer == null){ myMediaPlayer = MediaPlayer.create(context,R.raw.arrive);} myMediaPlayer.start(); }
分析R.raw.arrive是指在res包下面创建一个raw文件夹,raw文件夹等级与layout等文件夹等级相同,再将音频文件(如music.mp3)放在资源res文件夹下的raw中。
第二种方式代码如下:
String path = "/sdcard/musics/music.mp3"; public void playMusic(String path){ MediaPlayer myMediaPlayer =null; if(myMediaPlayer = null){ myMediaPlayer = new MediaPlayer(); } try { myMediaPlayer.reset(); myMediaPlayer.setDataSource(path); myMediaPlayer.prepare(); myMediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); } }
分析path是sd卡中音频文件的路径,比分说我在我的sd中建立了一个文件夹,名字是musics并且在这个文件夹中放置了我的music.mp3等音频文件,那么这些音频文件的路径就是/sdcard/musics/音频文件名.mp3。
到了这里就有问题了,第一个问题,如果使用第一种方式播放音频文件,那么在我们做的程序中,就需要将音频文件添加到程序中去,如果是这样的话,我们的程序做成软件,其文件就很大,所有如果想要播放一些大的音频的话,通过第一种播放音频的方式是效果不好的。不过我们能使用第一种方式去播放默认音频,比方说一些软件自带的默认音乐。
第二个问题就是,使用第二种方式播放音频,怎么获取音频的path呢。
第一种,比较笨,但却很实用的方法。首先创建文件更目录,然后得到目录下面所有文件或文件夹,获取这些文件数据,对这些文件进行分析,如果是文件夹则进行递归操作,如果是文件,则将文件与关键字进行比较,筛选出音频文件或其他与关键字匹配文件。
File file = new File("/sdcard"); public void ToSearchFiles(File file) { File[] the_Files = file.listFiles(); if (the_Files != null) { for (File tempF : the_Files) { if (tempF.isDirectory()) { ToSearchFiles(tempF); } else try { name = tempF.getName(); if (name.endsWith(".mp3") || name.endsWith(".MP3")) { HashMap<String, String> song = new HashMap<String, String>(); song.put("songTitle",name.substring(0, (name.length() - 4))); path = tempF.getPath(); song.put("songPath", path); songsList.add(song); } } catch (Exception e) { Toast.makeText(this, "路径错误", Toast.LENGTH_SHORT).show(); } } } }
这种方法效率不高,但却实用,其他后缀的文件也可以用这个方法进行搜索,只需要将判断语句修改即可。第二种方法与第一种方法相似,但使用了过滤器。Filter过滤器。下面使用的是FilenameFilter 过滤器,FilenameFilter 过滤器中有一个抽象方法 public boolean accept(File dir, String name) {}这个方法需要我们重写使用,这个方法的作用就是进行文件筛选,如果文件name中包含关键字,则通过过滤器,否则不通过。
第二种
public class MusicFileFind { final String MEDIA_PATH = new String("/sdcard"); ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); public MusicFileFind() { } public ArrayList<HashMap<String, String>> getPlayList() { File home = new File(MEDIA_PATH); if (home.listFiles(new FileExtensionFilter()).length > 0) { for (File file : home.listFiles(new FileExtensionFilter())) { HashMap<String, String> song = new HashMap<String, String>(); song.put("songTitle",file.getName().substring(0,(file.getName().length() - 4))); song.put("songPath", file.getPath()); songsList.add(song); } } return songsList; } class FileExtensionFilter implements FilenameFilter { public boolean accept(File dir, String name) { return (name.endsWith(".mp3") || name.endsWith(".MP3")); } } }这个方法使用了过滤器Filter,如果文件名的末尾是以.mp3或者.MP3结尾的文件都将添加到队列songsList中。从而songsList中包含所有的音频文件。
在android中的第三种方法是调用android系统提供的多媒体数据库,通过查询语句获取sd卡中所有的音频文件,然后添加到列表中
ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); String[] cols = new String[] {MediaStore.Audio.Media.SIZE,MediaStore.Audio.Media.MIME_TYPE,MediaStore.Audio.Media.DISPLAY_NAME}; int[] ids = new int[]{R.id.size,R.id.type,R.id.display_name}; if(cursor!=null){ startManagingCursor(cursor); } SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.song_list,cursor,cols,ids); setListAdapter(adapter);
下面内容来自网络
MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了。ContentResolver实例获得后,就可以进行各种查询,下面我就以音频数据库为例讲解增删改查的方法,视频和图像和音频非常类似。
在讲解各种查询之前,我给大家介绍下怎么看android都提供了哪些多媒体表。在adb shell中,找到/data/data/com.android.providers.media/databases/下,然后找到SD卡的数据库文件(一般是
一个.db文件),然后输入命令sqlite3加上这个数据库的名字就可以查询android的多媒体数据库了。.table命令可以列出所有多媒体数据库的表,.scheme加上表名可以查询表中的所有列名。这里可以利
用SQL语句来查看你想要的数据,记得最后一定要记住每条语句后面都加上分号。下面开始讲述怎么在这些表上进行增删改查。
查询,代码如下所示:
Cursor cursor = resolver.query(_uri, prjs, selections, selectArgs, order);ContentResolver的query方法接受几个参数,参数意义如下:
Uri:这个Uri代表要查询的数据库名称加上表的名称。这个Uri一般都直接从MediaStore里取得,例如我要取所有歌的信息,就必须利用MediaStore.Audio.Media. EXTERNAL _CONTENT_URI这个Uri。
专辑信息要利用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI这个Uri来查询,其他查询也都类似。
Prjs:这个参数代表要从表中选择的列,用一个String数组来表示。
Selections:相当于SQL语句中的where子句,就是代表你的查询条件。
selectArgs:这个参数是说你的Selections里有?这个符号是,这里可以以实际值代替这个问号。如果Selections这个没有?的话,那么这个String数组可以为null。
Order:说明查询结果按什么来排序。
上面就是各个参数的意义,它返回的查询结果一个Cursor,这个Cursor就相当于数据库查询的中Result,用法和它差不多。
增加,代码如下所以:
ContentValues values = new ContentValues(); values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER,0); resolver.insert(_uri, values);这个insert传递的参数只有两个,一个是Uri(同查询那个Uri),另一个是ContentValues。这个ContentValuses对应于数据库的一行数据,只要用put方法把每个列的设置好之后,直接利用insert方法去插入就好了。
通过上面几种方法,我们就可以搜索到手机sd卡中音频文件。通过
path=songsList.get(index).get("songPath");得到音频文件的路径,接下来就可以播放音频了。