【Android】如何通知MediaScanner扫描出指定文件

作者:Yogi

前言:如果要扫描u盘的话,通过发送广播的方式,则会扫描整个u盘,若文件多,那是相当耗时的。这里教你如何扫描指定的文件夹,若知道文件名,当然也可以扫描指定文件。扫描之后,我们就可以在媒体数据库查询到新添加的文件了。

#原理
用MediaScannerConnectionClient来通知MediaScanner更新单个文件,不需要用广播的方式,也就不需要系统权限(android:sharedUserId=“android.uid.system”)了。

#代码

/**
     * notify media scanner to update database.
     * @author yogi
     * @version 1.0.0
     */
    final class MyMediaScannerConnectionClient implements MediaScannerConnectionClient {
        /**
         * file name of your first time,because when you invoke this,media scanner connection may not connected,when it connected,it will invoke onMediaScannerConnected() automatically.
         */
        private String mFilename = null;
        /**
         * service connection to media scanner.
         */
        private MediaScannerConnection mConn = null;

        /**
         * constructor.
         * @param ctx context.
         * @param file file name.
         */
        public MyMediaScannerConnectionClient (final Context ctx, final String file) {
            this.mFilename = file;
            mConn = new MediaScannerConnection(ctx, this);
            Log.i(TAG, "MyMediaScannerConnectionClient constructor,connect service here");
            mConn.connect();
        }

        /**
         * scan file,it can be directory or single file.
         * @param fileName fileName,if it's a directory,then get its every file.
         */
        public void scanFile(final String fileName) {
            Log.i(TAG, "scanFile fileName=" + fileName);
            if (TextUtils.isEmpty(fileName)) {
                Log.w(TAG, "scanFile fileName empty!!!");
                return;
            }
            File f = new File(fileName);
            if (!f.exists()) {
                Log.w(TAG, "scanFile this file does not exist!!!");
                return;
            }
            if ((mConn != null)
                    && mConn.isConnected()) {
                if (f.isDirectory()) {
                    File[] filesInThisDir = f.listFiles();
                    if ((filesInThisDir != null)
                            && (filesInThisDir .length > 0)) {
                        for (File file : filesInThisDir) {
                            String filePath = file.getAbsolutePath();
                            Log.i(TAG, "scanFile directory file:getAbsolutePath=" + filePath);

                                scanFile(file.getAbsolutePath());
                           
                        }
                    }
                    Log.i(TAG, "scanFile it's a directory,now scan its files done");
                } else {
                    mConn.scanFile(fileName, null);
                    Log.i(TAG, "scanFile the file done");
                }
            }
        }

        @Override
        public void onMediaScannerConnected() {
            Log.i(TAG, "onMediaScannerConnected  mFilename= " + mFilename);
            scanFile(mFilename);
            Log.i(TAG, "onMediaScannerConnected scanFile done");
        }

        @Override
        public void onScanCompleted(final String path, final Uri uri) {
            Log.i(TAG, "onScanCompleted  scan path=" + path
                    + " uri= " + uri);
            //            mConn.disconnect();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值