最开始想做这个的原因是因为看了MediaScanner类的一些知识,感觉在Android系统都还是蛮重要的。于是想写一个小例子,搜索一下自己SD卡中的歌曲文件,练练手。这次写demo,学到的东西都还是蛮多的,包括以前也接触到的ContentResolver,还有MIMEType等和Uri有关的知识。
有两种方法得到文件:
1、我在书上看到,系统在启动的时候,会调用MediaScanner的方法,来对SD卡中的所有文件进行扫描和归类,这里拿audio文件为例,扫描的audio文件,android将audio文件的文件名,长度,作者,专辑等信息存储到一个类似于库的东西,然后第三方app可以通过ContentResolver去调用它,如下:
ContentResolver audio=new ContentResolver(this); Cursor cursor=audio.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);然后就可以用cursor去访问表里的各个元素了。缺陷之一就是,如果向系统中新添文件,库是不会发生更新的,这个时候,如果向让库更新,必须要通过intent启动MediaScanner服务。
2、但是这个让我不禁想到,以前开播放器的时候,有一个漫长的扫描过程(当然现在做的UI非常好了,估计用的就是1的方法吧),然后app的中间会出现一个进度框,上面显示着扫描的文件,如果是这样做的话,应该就是逐一遍历了,思路比较简单,但是碰到了几个难点吧。
(1)关于判断是否为音频文件(用MIMEType)
很简单,后缀名!但是android这个系统里用了MIMEType这个概念,可以理解为文件类型的另一种表示形式吧,在网上可以找到后缀名和MIMEType对应的表。得到文件后缀名之后,在表中查找相对应的MIMEType,然后再进行判断就可以了。
(2)进度框的问题
刚开始想着直接扫描到哪个文件,就用 handler显示到UI上,后来发现,这样好像MessageQueue里的东西太多了,导致程序Not responding,所以,后来用随机数的方式,随机显示扫描的文件了。不知道以前那种方法是怎么做的呢。
PS:MIMEType貌似有很多好处,但我注意到一个问题:我从酷狗app上下载的歌曲的文件是搜不到的,也就是说,酷狗app里自定义了MIMEType,表示着它下载的歌曲只能由它自己的app来播放。是不是太霸道了= =可能也涉及到一些编解码的问题吧。。。。
感觉自己这几天进度慢死了。。要努力点才可以!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于