Android 媒体扫描MediaScanner

MediaScanner是Android系统用于自动扫描音视频资源的关键组件。本文深入探讨其源代码,并指导如何触发媒体扫描。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • MediaScanner

    MediaScanner主要用于自动扫描Android系统中的音视频等媒体资源;本文主要讲述相关源代码以及如何触发媒体扫描。

     相关代码:MediaScannerReceiver.java 和 MediaScanner,建议直接阅读源代码,如在线代码阅读网站[1]。
          说明:1. 在系统启动的时候,会进行媒体扫描:内部 和外部;
                    2. 在SD卡插上的时候,会进行扫描;( Intent . ACTION_MEDIA_MOUNTED
                    3. 应用程序发送广播( Intent . ACTION_MEDIA_SCANNER_SCAN_FILE),注意此时只能扫描外部存储空间。

          其中1,2自动完成: 完成前后会向APP发送  Intent . ACTION_MEDIA_SCANNER_STARTED 和  Intent . ACTION_MEDIA_SCANNER_FINISHED;3完成之后,貌似不会发送以上广播给用户。
                   
  •      如何运行Media scanner ?
     方法1: 采用broadcast 事件;

/**
 * Sends a broadcast to have the media scanner scan a file
 * 
 * @param path
 *            the file to scan
 */
private void scanMedia(String path) {
    File file = new File(path);
    Uri uri = Uri.fromFile(file);
    Intent scanFileIntent = new Intent(
            Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
    sendBroadcast(scanFileIntent);
}

     方法2: 采用MediaScannerConnection
     适合查询单个文件,先建立连接、注册监听器、然后调用scanFile接口即可,代码如下。 
public   class   SingleMediaScan   implements   MediaScannerConnectionClient{
      private   static   final   String   TAG   =   "SingleMediaScan" ;
     
      private   static   SingleMediaScan   mInstance ;
     
      private   MediaScannerConnection   mScan ;
      private   String   mPath ;
      private   int   mCount   = 0;
     
      private   SingleMediaScan(Context context) {
              mScan   =   new   MediaScannerConnection(context,   this );
     }
     
      public   static   SingleMediaScan getInstance() {
              if (   mInstance   ==   null ) {
                   mInstance   =   new   SingleMediaScan(MyApplication.getContext());
           }
              return   mInstance ;
     }
                
      public   void   startScan(String path) {
              mPath   = path;
              mCount ++;
              mScan .connect();
     }

      /**
      * Part of the MediaScannerConnectionClient interface. Do not call.
      */
      @Override
      public   void   onMediaScannerConnected() {
              //   TODO   Auto-generated method stub
           Log. d( TAG ,   "scan connected! path: "   +   mPath   );
              //mScan.scanFile(mPath, "audio/mpeg3");
              mScan .scanFile(   mPath ,   null );         
     }

      /**
      * Part of the MediaScannerConnectionClient interface. Do not call.
      */
      @Override
      public   void   onScanCompleted(String path, Uri uri) {
              //   TODO   Auto-generated method stub
              if (--   mCount   == 0) {
                   mScan .disconnect();
           }
           
           Log. d( TAG ,   "scan Completed"   + path +   " || "   + uri);
              if (uri ==   null ) {
                Log. e( TAG ,   "scan failed!"   );
                   return ;
           }
     }
}

==========
只需要运行 SingleMediaScan.getInstance().startScan("/mnt/sdcard/xxx.mp3")


参考文献


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值