【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();
        }

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章