热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

基于Android扫描sd卡与系统文件的介绍

本篇文章是对Android扫描sd卡与系统文件进行了详细的分析介绍,需要的朋友参考下
如果你做过多媒体应用,一定会苦恼过,怎样获取sd卡中的多媒体文件。android还是很强大的,如果你知道怎么调用android的api,万事就ok了。
当手机或模拟器开机时,会调用android的MediaScanner,扫描sd卡和内存里的文件。以下是log信息。
代码如下:

12-13 15:39:11.062: VERBOSE/MediaPlayerService(67): Create new media retriever from pid 34912-13 15:39:11.082: DEBUG/MediaScannerService(349): getDefaultLocale =zh_CN
12-13 15:39:11.122: DEBUG/SurfaceFlinger(102): Layer::requestBuffer(this=0x7c8c68), index=1, pid=12866, w=309, h=192 success
12-13 15:39:11.142: INFO/MediaScanner(349): mOriginalCount = 14, prune thumb flag = false12-13 15:39:11.142: DEBUG/MediaScanner(349):  prescan time: 44ms12-13 15:39:11.142: DEBUG/MediaScanner(349):     scan time: 13ms12-13 15:39:11.142: DEBUG/MediaScanner(349): postscan time: 2ms12-13 15:39:11.142: DEBUG/MediaScanner(349):    total time: 59ms12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker12-13 15:39:11.152: DEBUG/MediaProvider(349): un-lock thumbnail worker12-13 15:39:11.182: DEBUG/MediaScannerService(349): done scanning volume external

那么扫描后的记录它保存到哪里了呢。哈。你觉得在哪里呢?data/data/com.android.media/providers/databases/external
它存了些什么信息呢,拉出来看看吧:

那么,我们直接使用ContentProvider就可以直接获取到sd卡中多媒体的信息了,你还用去listfile么?还用去自己解析媒体文件中的信息么(时长,文件名,专辑名。。应有尽有哦)?
代码如下:

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}
    , "_size>?", new String[]{1024*1024+""},null);

好了,最后一个问题
当你往sd卡中添加一些多媒体文件的时候,android没有自动将它刷新到数据库中。那么我们怎么让它手动刷新呢,如下:
代码如下:

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
        intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
        intentFilter.addDataScheme("file");
        scanReceiver = new ScanSdFilesReceiver();
        registerReceiver(scanReceiver, intentFilter);
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

 
private class ScanSdFilesReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)) {
                scanHandler.sendEmptyMessage(STARTED);
            }
            if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {
                scanHandler.sendEmptyMessage(FINISHED);
            }
        }
    }

 
private Handler scanHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case STARTED:
                MyDialog scanDialog = new MyDialog(LocalList.this);
                scanAlertDialog = scanDialog.scanFile();
                scanAlertDialog.show();
                Log.i(TAG, "showing");
                break;
            case FINISHED:
                ArrayList tempSOngs= ReadFileList.readDataFromSD(LocalList.this, LOCAL);
                if (tempSongs != null && tempSongs.size()>0) {
                    if (songs != null && songs.size()>0) {
                        songs.clear();
                        songs.addAll(tempSongs);
                        songAdapter.notifyDataSetChanged();
                    }else {
                        sOngs= new ArrayList();
                        songs.addAll(tempSongs);
                        initSong_lv();
                    }
                }else {
                    Toast.makeText(LocalList.this, "SD卡中没有歌曲,请添加后再扫描", Toast.LENGTH_SHORT).show();
                }
                Log.i(TAG, "finish");
                if (scanAlertDialog!=null && scanAlertDialog.isShowing()) {
                    scanAlertDialog.dismiss();
                }
                unregisterReceiver(scanReceiver);
                break;
            case DISMISS:
                Log.i(TAG, "dismiss");
                if (scanAlertDialog!=null && scanAlertDialog.isShowing()) {
                    scanAlertDialog.dismiss();
                }
            default:
                break;
            }


推荐阅读
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 原理:dismiss再弹出,把dialog设为全局对象。if(dialog!null&&dialog.isShowing()&&!(Activity.)isFinishing()) ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了使用SSH免密登录的步骤,包括生成公私钥、传递公钥给被登录机、修改文件权限的操作。同时提醒用户注意私钥的传递方式,建议使用U盘等离线方式传递。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
author-avatar
as16as1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有