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

作者:Yogi

福利

想了解买房知识,可以找我的朋友,千里马(qianlima0068),教你低首付买房。(注明:CSDN的朋友介绍的)

前言:如果要扫描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();
        }

    }

你可能感兴趣的:(Android,问题记录)