有没有用A卡的.如果玩三测要换显卡了

下次自动登录
现在的位置:
& 综合 & 正文
【Android开发经验】如何获取媒体库中所有音频文件信息,并在文件增删后及时更新媒体库
转载请注明出处:
今天一打开博客,发现一位朋友给我发了一封私信,请教下面的问题,所以特写此,为其解惑。
从这位朋友的提问中,我们需要了解下面的这些问题,才能给他很好的解答:
(1)如何获取手机里所有歌曲的信息?
(2)在歌曲文件发生改变,比如增删操作之后,如何及时的更新媒体库,从而获取到最新的歌曲信息?
(3)在4.4版本之后,扫描sd卡,更新媒体库的操作发生变化了吗?
下面,我将就以上三个问题,进行解答。
(1)如何获取手机里所有歌曲的信息?
如果要解决这个问题,那么我们首先要知道在Android系统中,是如何对歌曲信息进行管理的。
在Android中,系统为多媒体类型的文件(比如图片、音频、视频等)建立了数据库(sqlite数据库),从而完成多媒体数据的维护工作。我们当然可以不用这些系统的数据库,比如说,如果我们想获取所有歌曲,我们可以扫描sd上所有的文件夹中的文件,然后根据文件的后缀名,就可以取到我们想要的mp3、wma文件等。但是,这样的操作是非常效率低下的,所以是行不通的。
Android系统为我们建立起多媒体数据库之后,便把多媒体常用的信息,比如歌曲名、文件大小、播放时长、专辑、歌手等常用信息保存在了数据库里,那我们可以直接用多媒体库中的数据,完成这个需求。虽然我们需要用多媒体库,但是我们不能直接操作。Android为这些常用的需要共享的数据(多媒体和联系人等),创建了ContentProvider,因此,如果我们想获取到这些信息,我们就需要用ContentProvider。
在开始介绍之前,先给出需要用到的歌曲的实体类
* @ClassName: com.example.mediastore.Song
* @Description: 歌曲实体类
* @author zhaokaiqiang
上午11:49:59
public class Song {
private String fileN
private String fileU
public String getFileName() {
return fileN
public void setFileName(String fileName) {
this.fileName = fileN
public String getTitle() {
public void setTitle(String title) {
this.title =
public int getDuration() {
public void setDuration(int duration) {
this.duration =
public String getSinger() {
public void setSinger(String singer) {
this.singer =
public String getAlbum() {
public void setAlbum(String album) {
this.album =
public String getYear() {
public void setYear(String year) {
this.year =
public String getType() {
public void setType(String type) {
this.type =
public String getSize() {
public void setSize(String size) {
this.size =
public String getFileUrl() {
return fileU
public void setFileUrl(String fileUrl) {
this.fileUrl = fileU
public Song() {
public Song(String fileName, String title, int duration, String singer,
String album, String year, String type, String size, String fileUrl) {
this.fileName = fileN
this.title =
this.duration =
this.singer =
this.album =
this.year =
this.type =
this.size =
this.fileUrl = fileU
public String toString() {
return "Song [fileName=" + fileName + ", title=" + title
+ ", duration=" + duration + ", singer=" + singer + ", album="
+ album + ", year=" + year + ", type=" + type + ", size="
+ size + ", fileUrl=" + fileUrl + "]";
有了上面的这些信息,我们完全可以做一个播放器了!
有了实体类之后,我封装了一个类,专门用来获取歌曲信息,下面是实现的
* @ClassName: com.example.mediastore.AudioUtils
* @Description: 音频文件帮助类
* @author zhaokaiqiang
上午11:39:45
public class AudioUtils {
* 获取sd卡所有的音乐文件
* @throws Exception
public static ArrayList&Song& getAllSongs(Context context) {
ArrayList&Song& songs =
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);
songs = new ArrayList&Song&();
if (cursor.moveToFirst()) {
Song song =
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));
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 size = cursor.getInt(8) / 1024f / 1024f;
song.setSize((size + "").substring(0, 4) + "M");
song.setSize("未知");
// 文件路径
if (cursor.getString(9) != null) {
song.setFileUrl(cursor.getString(9));
songs.add(song);
} while (cursor.moveToNext());
cursor.close();
代码的思路很简单,我们需要根据ContentResover获取到一个Cursor,然后根据这个游标,遍历所有的歌曲的信息。在上面的代码中,我们查询出了包括歌名、路径、文件大小等在内的共10项数据,对于一般的应用这些足够了。查询出来之后,我们把信息转换成了实体类,这样操作起来更加方便。
如果要使用这个工具类,记得添加权限 &uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&
(2)如何及时更新媒体库
Android系统刷新媒体库的数据的时机,是在开机的时候,即手机一开机,系统便重新扫描一下sd卡,并将多媒体数据库更新一下。如果用户删除了某一个音频文件,不重新开机的话,数据库中的数据是不会更新的。那么,如果我们想用户一打开软件,就强制的更新多媒体数据库,应该怎么做呢?
在4.4版本之前,我们可以使用发送广播的方式,强制刷新多媒体库
IntentFilter intentFilter = new IntentFilter(
Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addDataScheme("file");
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory()
.getAbsolutePath())));
发送广播之后,还需要注册一个广播接受者,来接受并处理扫描开始和结束事件
private class ScanReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// 当系统开始扫描sd卡时,为了用户体验,可以加上一个等待框
if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)) {
// 当系统扫描完毕时,停止显示等待框,并重新查询ContentProvider
if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {
通过这种方式,我们便可以强制更新媒体库。
但是,在4.4之后,Android对一些操作的权限提高,如果在4.4的系统上使用这种方式,便会出现下面的错误
Caused by: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=22360, uid=10163
这是因为在4.4之后,这个广播只有系统应用才能发出,因此,我们不能使用这种方式了,我们可以使用下面的代码实现相同的功能:
MediaScannerConnection.scanFile(this, new String[] { Environment
.getExternalStorageDirectory().getAbsolutePath() }, null, null);
使用MediaScannerConnection的scanFile方法,就可以强制扫描我们需要更新的文件路径,之后媒体数据库也会同步更新,这样,就不会出现文件删除,在媒体库中却能搜索到的情况了,也能解决这位朋友提出的新增加歌曲的信息获取问题了。
&&&&推荐文章:
【上篇】【下篇】Android 谈谈文件怎么样获取_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Android 谈谈文件怎么样获取
上传于|0|0|文档简介
&&Android 谈谈文件怎么样获取
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢Android中如何在命令行中查看某个文件的内容_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Android中如何在命令行中查看某个文件的内容
来源:Linux社区&
作者:cjjky
在中,假如我们在程序开发中使用SharedPreferences对象在路径:/data/data/[PackageName]/shared_prefs目录下创建了一个 userinfo.xml 文件,并在该文件中保存了一些基础的信息。如果我们想查看该文件的内容,该如何查看呢?有两种方法可以查看,第一:采用Eclipse中自带的 File Explorer 工具把该文件导出来[pull a file from the device]。然后用相应的查看工具查看文件的内容。第二:我们可以不用采用第一种方法,采用一种更加简单的方法来查看文件的内容,在命令行窗口中使用命令来查看该文件。
步骤如下:
1 . 点击【开始】--&【运行】--& cmd ,将弹出DOS命令窗口。然后按着下图中的红色框框步骤即可以查看文件的内容。
我们看到使用 【cat + 文件名.后缀】 的方式即可以查看该文件的内容。
相关资讯 & & &
& (07/13/:14)
& (08/11/:27)
& (05/06/:13)
& (04/17/:32)
& (05/31/:15)
& (04/02/:07)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款一直以来对Android系统目录的获取方法和具体代表含义没有掌握清楚,今天特意整理了一下,分享给大家,对自己也是一个总结。
在android 6.0以前,你可以只关注外置存储是否挂载即可,但是从6.0以后,也就是M系统后,还需要判断是否有读写权限,只有具备这些权限才可以读写外置存储。
一直以来对Android系统目录的获取方法和具体代表含义没有掌握清楚,今天特意整理了一下,分享给大家,对自己也是一个总结。
在android 6.0以前,你可以只关注外置存储是否挂载即可,但是从6.0以后,也就是M系统后,还需要判断是否有读写权限,只有具备这些权限才可以读写外置存储。
1,Context.getFilesDir
获取路径:/data/user/0/应用包名/files
该目录是应用的文件存储目录,应用被卸载时,该目录一同被系统删除。默认存在,默认具备读写权限(6.0系统可以不用向用户申请)
2,Context.getCacheDir
获取路径:/data/user/0/应用包名/cache
该目录是应用的文件缓存目录,应用被卸载时,该目录一同被系统删除。默认存在,默认具备读写权限。不同于getFileDir,该目录下的文件在系统内存紧张时,会被清空文件,来腾出空间供系统使用,著名的图片加载库ImageLoader就是在没有外置存储读写权限时使用此文件夹。getFileDir,不会因为系统内存不足而被清空。(6.0系统可以不用向用户申请)
3,Context.getObbDir
获取路径:/storage/emulated/0/Android/obb/应用包名
该目录是应用的数据存放目录,一般被用来存放游戏数据包obb文件。默认存在,可读写(6.0系统可以不用向用户申请)
4,Context.CodeCacheDir
获取路径:/data/user/0/应用包名/code_cache
默认存在,可读写。(6.0系统可以不用向用户申请)
5,Context.getExternalFilesDir
获取路径:(以下载目录为准) /storage/emulated/0/Android/data/应用包名/files/Download
默认存在,可读写。(6.0系统可以不用向用户申请)
6,Context.getExternalCacheDir
获取路径:/storage/emulated/0/Android/data/应用包名/cache
默认存在,可读写。(6.0系统可以不用向用户申请)
7,Context.getDatabasePath
获取路径:/data/user/0/应用包名/databases/参数名
默认不存在,可读写。(6.0系统可以不用向用户申请)
8,Context.getDir
获取路径:/data/user/0/应用包名/app_参数名
默认存在,可读写。分为Private等三个权限,private代表仅能自己访问。(6.0系统可以不用向用户申请)
9,Context.getPackageCodePath
获取路径:/data/app/应用包名-1/base.apk
默认存在,获取apk包路径
10,Context.getRootDirectory
获取路径:/system
默认存在,不可读写(除非具备root权限)
11,Environment.getExternalStorageDirectory
获取路径:/storage/emulated/0
默认存在,声明权限则可读写(6.0和以后系统还需要向用户申请同意才可以)
12,Environment.getExternalStoragePublicDirectory
获取路径:/storage/emulated/0/Download(以下载目录为例)
默认存在,声明权限则可读写(6.0和以后系统还需要向用户申请同意才可以)
13,Environment.getDownloadCacheDirectory
获取路径:/cache
默认存在,声明权限则可读写(6.0和以后系统还需要向用户申请同意才可以)
14,Context.getFileStreamPath
获取路径:/data/data/应用包名/files/download(示例download)
该目录是应用的文件存储目录,应用被卸载时,该目录一同被系统删除。默认存在,默认具备读写权限(6.0系统可以不用向用户申请)
1)上述路径是通过getAbsulotePath方法获得,一般情况下等同于getPath
2)在6.0系统上,一般Java层实现对外置存储的文件操作需要向用户申请,如果用C层实现,则可以越过这种限制
3)配置targetsdk为19,compilesdk为22,可以避免在6.0手机上的权限限制
用云栖社区APP,舒服~
【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!&&
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、复杂的移动安全挑战等...
HTTPDNS是面向移动开发者推出的一款域名解析产品,具有域名防劫持、精准调度的特性。
面向阿里云ECS实例、HPC和Docker的文件存储服务。
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...推荐这篇日记的豆列
&&&&&&&&&&&&}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信