作者: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();
}
}