`
gogoalong
  • 浏览: 47795 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

参加高德地图比赛-技术点之文件搜索

阅读更多
第二:技术点之文件搜索
    在一个人经过艰苦奋斗终于做出一件像样点的作品之后,我的心情那是飞一般的感觉。不过现在回想起自己在制作作品的过程中,遇到的种种困境、解决问题的方法、分析问题的过程的时候,那些东西可是刻骨铭心的。这些所有的东西都见证了我的进步。
    第一,音频文件的搜索与播放:
   先讲音频文件的播放,这个比较容易,在做高德之前,我已经做过音频播放的测试。音频播放有两种方法,第一种方式代码如下
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");
得到音频文件的路径,接下来就可以播放音频了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics